关于Object.hashcode()和冲突

Lui*_*ese 5 java hashcode hash-collision

我在阅读JavaDocObject.hashCode方法,它说

在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的。

但是无论其实现是什么,hashCode方法总是返回一个(假设为正数)整数,因此给定Integer.MAX+1不同的对象,其中两个对象将具有相同的哈希码。

为什么JavaDoc在这里“否认”冲突?考虑到使用了内部地址并且“ 来了,您永远不会立即Integer.MAX+1在内存中存储对象,因此我们可以说它实际上总是唯一的这是否是一个实用的结论?

编辑

这个错误条目(感谢Sleiman Jneidi)对我的意思给出了确切的理解(似乎已经有10多年的讨论了):

看来,很多(也许是多数)程序员都认为这意味着默认实现以及System.identityHashCode将产生唯一的哈希码。

实际上,“在合理范围内尽可能多”的限定条件不足以使哈希码在实践中并不明显。

Sle*_*idi 3

这些文档确实具有误导性,并且很久以前就存在一个错误,该错误表示文档具有误导性,特别是实现是JVM相关的,并且在实践中,特别是在堆大小很大的情况下,将对象标识映射到 32 时很可能会发生冲突位整数