hashCode()的默认行为

Ale*_*lex 5 java

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

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

每次在我的机器上运行程序(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()如何运作?

NPE*_*NPE 5

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

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

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

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


小智 3

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