两个具有相同哈希码的Java对象不一定相等吗?

Abi*_*idi 16 java hashcode

我理解为什么为两个相等(通过equals)对象提供相同的哈希码很重要.但反过来也是如此,如果两个对象具有相同的哈希码,它们必须相等吗?合同是否仍然有效?我无法找到可能发生这种情况的示例,因为如果所有参与equals方法的属性也被用于覆盖hashcode方法,那么我们将始终使用相同的对象的哈希码.请评论.

Pet*_*hev 49

如果两个对象具有相同的哈希码,则它们不一定相等.否则你会发现完美的哈希函数.但事实恰恰相反 - 如果对象相等,那么它们必须具有相同的哈希码.

  • +1这一般也与散列对象有关,而不仅仅是java对象. (6认同)

sup*_*cat 7

hashCode函数的目的是允许对象快速分割成已知不等于其自身集合之外的所有项的集合.假设一个有1,000个项目,一个将它们分成十个大致相等大小的集合.一次呼叫hashCode可以快速识别该项目不等于900项,而不必使用equals任何这些项目.即使必须使用equals该项目与100个其他项目进行比较,这仍然只是将其与所有1000个项目进行比较的成本的1/10.在实践中,即使在大型收藏品中,hashCode也会经常消除99.9%或更多的不平等物品,最多只能检查一小部分.


Ale*_*ros 5

根据Javadoc的说法:http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29

如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果.但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能.

编辑:在现实世界中,两个字符串可能具有相同的哈希码.例如,如果要存储长度为10的包含小写英文字母(如"aaaaaaaaa","aaaaaaaa"等)的所有字符串组合,则无法为每个141.167.095.653分配唯一的哈希码. 376种组合,因为Java中的int是32位,因此最多可以有4.294.967.296个不同的值.