有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

所以我正在做一些关于比较字符串的研究,发现了以下代码:

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

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


共 (4) 个答案

  1. # 1 楼答案

    s1.hashCode () == s2.hashCode () && s1.equals (s2)这里,如果这个表达式的左边不是真的,它将不会计算右边。那么这将有助于加快速度。但并非总是如此

  2. # 2 楼答案

    我不认为它更快。如果是,它会被包含在字符串中。等于执行。请注意,第一个字符串。hashCode调用代价高昂。想象一下你只需要一根绳子。等于,但计算两个字符串的哈希值。这更像是一场表演比赛

  3. # 3 楼答案

    equals(Object)和hashCode()方法的一般约定规定,相等的对象将始终返回相等的hashCode。因此,很难看出比较hashcodes的相等性如何在性能方面为您带来任何好处,特别是在字符串是问题对象的情况下

    (旁注:请确保s1和s2不为null,然后再以书面形式调用它。)

  4. # 4 楼答案

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

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

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


    1根据supercat下面的评论,您还不知道通过其他机制散列码是相等的-不过我要说这是一个角落案例中的角落案例