Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hashCode()的默认行为_Java - Fatal编程技术网

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中)无关。有关详细信息,请参阅我的答案。