5

我不断在同一台机器上运行这个程序:

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()的操作方式?

4

2 回答 2

5

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

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

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

有关我过去所做调查的详细信息,请参阅Java 中的“内部地址”是什么?

于 2013-03-06T09:11:08.190 回答
3

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

于 2013-03-06T09:10:09.933 回答