Java hashCode()的默认行为
我在同一台机器上连续运行此程序:Java hashCode()的默认行为,java,Java,我在同一台机器上连续运行此程序: class Test { public static void main(String[] args) { Test test = new Test(); System.out.println(test.hashCode()); } } 每次在我的计算机上运行程序(Windows 7 64位)时,结果都是相同的: 4384790 在另一台机器(WindowsServer2008,64位)上,大多数情况下它会给我:
class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.hashCode());
}
}
每次在我的计算机上运行程序(Windows 7 64位)时,结果都是相同的:
4384790
在另一台机器(WindowsServer2008,64位)上,大多数情况下它会给我:1671711。但有时结果是:11394033
在我的机器上,我在Java HotSpot(TM)客户机VM 1.6.0_26/1.6.0_33下运行该程序
我已经阅读了对象类的文档:
只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(本
通常通过转换
对象转换为整数,但此实现技术不适用
JavaTM编程语言要求。)
但是,如果hashCode()确实是通过将对象的内部地址转换为整数来实现的,那么我仍然不理解为什么每次运行测试对象时Java VM都会为其分配相同的地址
默认hashCode()的操作方式是否确切已知?非内核程序从不使用绝对内存地址,它们使用虚拟内存,每个进程都有自己的地址空间。因此,程序在每次运行时都会将数据放在相同的位置。详细信息是JVM特有的。此外,一些(大多数?)JVM支持多个
hashCode()
算法(启动JVM时,您可以选择它将使用哪个算法)
有趣的是,大多数算法(包括Oracle的默认值)根本不使用对象的地址。例如,JDK7的默认hashCode()
使用全局伪随机数生成器,然后将生成的伪随机哈希代码缓存在对象的头中
当然,如果以相同的方式初始化,psuedo随机生成器将始终提供相同的数字序列
有关我在过去所做的调查的详细信息,请参见,它没有被仔细指定,正如您所发现的,它因平台而异。我认为“内部地址”不是RAM中的物理地址,而是JVM内部的某个地址,可能从同一个“逻辑”开始每次都要值——因此,如果始终在同一类中创建相同的对象,那么它将始终以“逻辑”地址方案(再次:我只是猜测)@感知:接受的其他问题的答案不适用于现代JVM。请参阅下面我的答案以获得解释(简而言之,
object.hashCode()
)根本不使用对象的地址。尽管这可能是真的,但这与object.hashCode()
(至少在现代Oracle JVM中)无关。有关详细信息,请参阅我的答案。