java - 结合 hashCode() 和 equals() 更快?

标签 java string equals hashcode

所以我正在做一些关于比较字符串最快的研究,并找到了这段代码:

if (s1.hashCode() == s2.hashCode() && s1.equals(s2))

我的问题是:为什么它更快?因为我认为这比只说没有 && 需要更多的计算机周期。

最佳答案

Java 字符串缓存它们的散列码 - 因此如果散列码相等,则字符串很可能相等。如果字符串的长度相同并且仅在接近末尾时不同,则完整的相等性检查可能需要更长的时间。 (Stringequals 的实现首先检查长度,然后再查看实际的代码单元。)

另一方面,这需要计算散列码 - 如果尚未计算,则字符串的长度为 O(n),而两个长度不等的字符串可以进行比较平等很快。

所以如果您知道字符串已经被散列并且您期望有很多字符串具有相同的长度1,这是一个优化——否则它会使事情变得更慢。不过,我不会在通用代码中使用它 - 我也会添加一条注释来解释使用它的原因。


1 并且您还不知道散列码通过其他机制是相等的,根据下面 supercat 的评论 - 我会说这是一个角落不过,在一个角落的情况下。

关于java - 结合 hashCode() 和 equals() 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20322356/

相关文章:

java - Java 中以 *** 分隔符分割字符串

c++ - 将一个字符串分成一个数组

Python:将来自不同目录的具有相同基名的文件分组

java - 查找数组中相同的元素并防止重复计数

java - 为什么 map 的第一个值不被第三个值覆盖?

java - Maven,失去本地依赖 |无法解决项目的依赖关系

java - 将 List<KeyPoint> 转换为 MatofKeypoints

java - 负载均衡器、套接字和 Java

python - 如何根据条件替换 pandas 列中的字符串?

java - 比较 java.awt.Color 对象时,JUnit Test 似乎无法正常工作