Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.identityHashCode()在对象被GC';预计起飞时间_Java_Jvm_Hashcode - Fatal编程技术网

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可以移动一个对象,然后可以在第一个对象的原始地址分配一个新对象。如果发生这种情况,两个对象可能最终使用相同的标识哈希代码。