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

gam*_* on 1 java string equals hashcode

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

if (s1.hashCode() == s2.hashCode() && s1.equals(s2))
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么它更快?因为我认为它需要更多的计算机周期,而不仅仅是说没有&&.

Jon*_*eet 16

Java字符串缓存其哈希码 - 因此,如果哈希码相等,则字符串很可能相等.如果字符串长度相同并且仅在最末端附近不同,则完全相等性检查可能需要更长时间.(equalsString查看实际代码单元之前,首先检查长度的实现.)

另一方面,这需要计算哈希码 - 如果尚未计算,则在字符串的长度中将是O(n),而可以非常快速地比较两个不等长度的字符串.

因此,如果您知道字符串已经被哈希并且您期望有大量具有相同长度1的字符串,那么这是一个优化 - 否则它可能会使事情变慢.我不会在通用代码中使用它 - 我也会添加一个注释来解释它的原因.


1 而且你还不知道的哈希码是通过一些其他的机制相同,按以下supercat的评论-我会说这是在一个角落里时的极端情况,虽然.

  • @ user2844805:你不能*只是*使用哈希码 - 可以有多个具有相同哈希码的不等字符串.它只是第一个过滤操作 - 具有不同哈希码的两个字符串*不能相等. (3认同)