在Javadoc for Object.hashCode()中声明
尽管合理实用,但是由class定义的hashCode方法
Object确实为不同的对象返回了不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术.)
这是一个常见的miconception,这与内存地址有关,但它并没有因为它可以在没有通知的情况下改变,而hashCode()不会,也不能改变对象.
@Neet提供了一个很好的答案的链接/sf/answers/39579151/但我正在寻找更多细节.
这是一个例子来说明我的担忧
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
for (int t = 0; t < 10; t++) {
System.gc();
Object[] objects = new Object[10];
for (int i = 0; i < objects.length; i++)
objects[i] = new Object();
for (int i = 0; i < objects.length; i++) {
if (i > 0) System.out.print(", ");
int location = unsafe.getInt(objects, Unsafe.ARRAY_OBJECT_BASE_OFFSET + Unsafe.ARRAY_OBJECT_INDEX_SCALE * i);
System.out.printf("%08x: hc= …Run Code Online (Sandbox Code Playgroud) 我在同一台机器上连续运行这个程序:
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()如何运作?