使用hashCode()测试字符串相等性

22 java string hashcode

是否有任何理由不能使用hashCode方法测试Java字符串的相等性?所以基本上,而不是....

"hello".equals("hello")
Run Code Online (Sandbox Code Playgroud)

你可以用......

"hello".hashCode() == "hello".hashCode()
Run Code Online (Sandbox Code Playgroud)

这很有用,因为一旦字符串计算了它的哈希码,那么比较一个字符串就像比较一个int一样有效,因为字符串缓存了哈希码,而且很可能字符串在字符串池中,如果你设计它办法.

ZZ *_*der 38

让我举个例子.试试这个,

public static void main(String[] args) {
    String str1 = "0-42L";
    String str2 = "0-43-";

    System.out.println("String equality: " + str1.equals(str2));
    System.out.println("HashCode eqauality: " + (str1.hashCode() == str2.hashCode()));
}
Run Code Online (Sandbox Code Playgroud)

我的Java上的结果,

String equality: false
HashCode eqauality: true
Run Code Online (Sandbox Code Playgroud)


dst*_*bbe 37

因为:如果对象相等,则两个对象的hashCodes必须相等,但是,如果两个对象不相等,则hashCode仍然可以相等.

(评论后修改)

  • +1,哈希码不保证唯一性 - 它们只尝试提供低冲突 (5认同)
  • +1,但是一个小修正案.如果对象相等,则两个对象的hashCodes必须相等,这在hashCode的协定中指定. (4认同)
  • 简短而正确的答案.做同样的事情只是为了尽可能高效听起来有点像我过早优化. (2认同)

Omr*_*dan 15

尽可能多的说hashCode并不保证唯一性.事实上,由于一个非常简单的原因,它无法做到这一点.

hashCode返回一个int,这意味着有2 ^ 32个可能的值(大约4,000,000,000),但肯定有超过2 ^ 32个可能的字符串,这意味着至少有两个字符串具有相同的哈希码值.

这被称为鸽子原理.


Jay*_*Jay 8

其他人指出了为什么它不起作用.所以我只是添加补充说,无论如何,收益将是最小的.

在Java中比较两个字符串时,String equals函数首先检查它们是否是对同一对象的两个引用.如果是这样,它会立即返回true.然后检查长度是否相等.如果不是,则返回false.只有这样才开始逐个字符地比较.

如果你正在操作内存中的数据,同一对象比较可以快速处理"相同"的情况,这是一个快速,嗯,4字节整数比较我认为.(如果对象句柄的长度错误,有人会纠正我.)

对于大多数不相等的字符串,我敢打赌长度比较很快发现它们不相等.如果您要比较两个名称 - 客户,城市,产品等等 - 它们的长度通常不等.所以一个简单的int比较快速处理它们.

性能最糟糕的情况是两个长的,相同的,但不是相同的对象字符串.然后它必须做对象句柄比较,false,继续检查.长度比较,真实,继续检查.然后通过字符串的整个长度逐个字符来验证是否确实它们一直到最后都是相等的.