所以我正在做一些关于比较字符串最快的研究,并找到了这段代码:
if (s1.hashCode() == s2.hashCode() && s1.equals(s2))
我的问题是:为什么它更快?因为我认为这比只说没有 && 需要更多的计算机周期。
最佳答案
Java 字符串缓存它们的散列码 - 因此如果散列码相等,则字符串很可能相等。如果字符串的长度相同并且仅在接近末尾时不同,则完整的相等性检查可能需要更长的时间。 (String
中 equals
的实现首先检查长度,然后再查看实际的代码单元。)
另一方面,这需要计算散列码 - 如果尚未计算,则字符串的长度为 O(n),而两个长度不等的字符串可以进行比较平等很快。
所以如果您知道字符串已经被散列并且您期望有很多字符串具有相同的长度1,这是一个优化——否则它会使事情变得更慢。不过,我不会在通用代码中使用它 - 我也会添加一条注释来解释使用它的原因。
1 并且您还不知道散列码通过其他机制是相等的,根据下面 supercat 的评论 - 我会说这是一个角落不过,在一个角落的情况下。
关于java - 结合 hashCode() 和 equals() 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20322356/