Java System.identityHashCode()在对象被GC';预计起飞时间
假设Java System.identityHashCode()在对象被GC';预计起飞时间,java,jvm,hashcode,Java,Jvm,Hashcode,假设System.identityHashCode(object1)==123,并且object1被垃圾收集。新创建的object2是否可能与GC'ed之前获得的object1具有相同的标识has code 新创建的object2是否可能具有与object1在GC’ed之前获得的相同的标识has代码 是的 当第一次为对象调用方法时,标识哈希代码(通常)从对象的地址派生。如果GC在计算哈希代码后移动了object1,则可以在以前用于object1的地址分配新对象(object2)。然后,您可能会得
System.identityHashCode(object1)==123,并且object1
被垃圾收集。新创建的object2
是否可能与GC'ed之前获得的object1
具有相同的标识has code
新创建的object2是否可能具有与object1在GC’ed之前获得的相同的标识has代码
是的
当第一次为对象调用方法时,标识哈希代码(通常)从对象的地址派生。如果GC在计算哈希代码后移动了object1
,则可以在以前用于object1
的地址分配新对象(object2
)。然后,您可能会得到具有相同哈希代码的object1
和object2
。。。尽管object1
和object2
是不同的对象(根据=
)
它们是哈希代码。。。不是对象的唯一标识符
我对标识的理解是,对象在给定的时间点在JVM中是唯一的
身份是独一无二的。标识哈希码不正确。正如对象
所述:
“只要合理可行,class对象定义的hashCode
方法确实会为不同的对象返回不同的整数。”
这远远不能保证独特性
然后:
“(这通常是通过将对象的内部地址转换为整数来实现的,但Java不需要这种实现技术™ 编程语言。)”
它指的是第一次调用hashCode()
时对象的地址。hashCode()
方法的契约声明hashCode值不能更改。身份哈希码是。。。实际上。。。作为对象的一部分记住,以便GC可以移动对象。根据定义,这是可能的
identityHashCode
是一个int
。Java中只有232个不同的整数。
您可以轻松编写一个创建超过232个对象的程序。是的,这是完全可能的。甚至有可能同时存在的两个对象具有相同的identityHashCode
。请注意System.identityHashCode()
的行为与Object.hashCode()的行为相同
-它只是忽略子类中的任何hashCode()
重写,是否有任何关于此的官方文档?我对标识的理解是,对象在给定的时间点在JVM中是唯一的@Mark Rotterveel在他的评论中说,identity HashCode Cof2对象在运行时可以是相同的,这与->identity hash code是对象分配的地址相反。但是identity hash code不是对象分配的地址-语句是“它(通常)从地址派生…”。另请参见“这是相反的->标识哈希代码是分配对象的地址”-不,不是。(甚至忽略“派生自”点。)GC可以移动一个对象,然后可以在第一个对象的原始地址分配一个新对象。如果发生这种情况,两个对象可能最终使用相同的标识哈希代码。