为什么默认对象的hashCode在不同的设备中返回不同的值?



通过查看周围的一些答案,似乎对默认hashCode()在不同对象上返回的内容有各种各样的意见:有人说它运行相同的算法,有人说它基于内存位置。

尽管如此,我已经运行了一些测试,在不同的 Android 模拟器上调用默认myCustomObject.hashCode(),似乎在每个模拟器中,hashCode总是相同的(即使在重新启动后),但每个模拟器都不同。

基于此,我不确定它是否真的基于算法;或者该算法是否包含一些与它的运行位置相关的信息,或者即使它确实是基于内存的(我对此表示怀疑,因为它在重新启动后将具有相同的值)。

你所知道的关于ObjecthashCode的就是JavaDoc所说的。这部分可能是最相关的:

在合理可行的范围内,类 Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。(哈希代码可能会也可能不会在某个时间点实现为对象内存地址的某个函数。

因此,它可能是独一无二的,但不能保证是独一无二的,您不能假设它会是。对于"内存位置"的任何给定定义,它可能是也可能不是对象内存位置的"某个函数",或者它可以是在创建时分配给对象的某个升序数字,等等。如果不深入研究您正在使用的JDK/JVM的源代码,您就不知道(hashCode是一个native函数,因此JDK中的src.zip在这里没有帮助),而且知道也没有实际的好处。

我不确定它是否

真的基于算法;或者该算法是否包含一些与它运行位置相关的信息,或者即使它确实是基于内存的(我对此表示怀疑,因为它在重新启动后将具有相同的值)。

它可以是 JVM 堆中的一个索引,对于相同的程序,它每次都会在同一个地方。

但再说一遍:你不知道,知道也没有实际的好处。

相关内容

  • 没有找到相关文章

最新更新