hashCode()的默认行为

时间:2013-03-06 09:06:08

标签: java

我在同一台机器上连续运行这个程序:

class Test {
    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.hashCode());
    }
}

每次在我的机器上运行程序(Windows 7 64位)时结果都一样: 4384790

在另一台机器上(Windows server 2008,64位),大多数时候它给了我:1671711。但有时候结果是:11394033。

在我的机器上,我在Java HotSpot(TM)Client VM 1.6.0_26 / 1.6.0_33下运行该程序

我已阅读Object类的文档:

  

尽可能合理,但Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这个   通常通过转换内部地址来实现   将对象转换为整数,但这种实现技术不是   JavaTM编程语言所要求的。)

但是如果确实通过将对象的内部地址转换为整数来实现 hashCode(),我仍然不明白为什么Java VM每次为Test对象分配相同的地址跑吧。

确切知道默认的 hashCode()是如何运​​作的?

2 个答案:

答案 0 :(得分:5)

详细信息是特定于JVM的。此外,一些(大多数?)JVM支持多种hashCode()算法(启动JVM时,您可以选择使用哪种算法)。

有趣的是,大多数算法 - 包括Oracle的默认值 - 都不使用对象的地址 。例如,JDK7的默认hashCode()使用全局伪随机数生成器,然后将生成的伪随机哈希码缓存在对象的头部中。

当然,如果以相同的方式初始化,伪随机生成器将始终给出相同的数字序列。

有关我过去所做调查的详细信息,请参阅What is an "internal address" in Java?

答案 1 :(得分:3)

非内核程序永远不会使用绝对内存地址,它们使用虚拟内存,每个进程都有自己的地址空间。因此,程序会在每次运行中将数据放在同一位置。