我在同一台机器上连续运行这个程序:
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()如何运作?
详细信息是特定于JVM的.此外,一些(大多数?)JVM支持多种hashCode()算法(启动JVM时,您可以选择它将使用哪种算法).
有趣的是,大部分的这些算法-包括Oracle的默认值-不要使用对象的地址在所有.例如,JDK7的默认值hashCode()使用全局伪随机数生成器,然后将生成的伪随机哈希码缓存在对象的头中.
当然,如果以相同的方式初始化,伪随机生成器将始终给出相同的数字序列.
有关我过去所做调查的详细信息,请参阅Java中的"内部地址"是什么?
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |