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

时间:2019-03-24 12:57:01

标签: java android algorithm memory hashcode

通过围绕SO的一些答案,似乎对不同对象的默认hashCode()返回值有各种看法:有人说它运行相同的算法,有人说它基于内存位置。

尽管如此,我还是进行了一些测试,在不同的Android模拟器上调用默认的myCustomObject.hashCode(),并且看来,在每个模拟器中,hashCode始终是相同的(即使在重启后也是如此)它),但每个人都不相同。

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

1 个答案:

答案 0 :(得分:2)

关于Object的{​​{1}}的所有信息是what the JavaDoc says。这部分可能是最相关的:

  

在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (在某个时间点,hashCode可能会或可能不会实现为对象内存地址的某些功能。)

因此,它可能是唯一的,但不能保证是唯一的,并且您不能假设它会是唯一的。对于任何给定的“内存位置”定义,它可能是对象的存储位置的“某种功能”,也可能不是。或者它可能是在创建对象时分配给该对象的一些升序数字,等等。您不知道无需深入研究您正在使用的JDK / JVM的源代码(hashCode是一个hashCode函数,因此JDK中的native在这里无济于事),此外,没有务实有益于了解。

  

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

它可能是JVM堆中的索引,每次使用同一程序时,该索引都将位于同一位置。

但是再说一次:您不知道,知道也没有务实的好处。