System.identityHashCode()可以在对象GC之后返回相同的hashCode

时间:2015-12-17 08:06:53

标签: java jvm hashcode

假设6713707System.identityHashCode(object1)==123被垃圾收集。是否有可能新创建的object1具有相同的标识,其代码与object2之前的代码相同?

2 个答案:

答案 0 :(得分:4)

  

新创建的object2是否有可能具有相同的标识,其代码与它在GC之前获得的对象相同?

是的。

身份哈希码(通常)是在首次为对象调用方法时从对象的地址派生的。如果GC在计算哈希码后移动scala.slick.codegen.SourceCodeGenerator,则可以在以前用于object1的地址处分配新对象(object2)。然后,您可以使object1object1具有相同的哈希码...尽管object2object1是不同的对象(根据object2)。< / p>

它们是哈希码...不是对象的唯一标识符。

  

我对身份的理解是,对象在给定时间点在JVM内部是唯一的。

身份是独一无二的。身份哈希码不是。正如== javadoc所说:

  

“尽可能合理,Object类定义的Object方法确实为不同的对象返回不同的整数。”

这远不是唯一性的保证。

然后:

  

“(这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。)”

它所指的是首次调用hashCode时对象的地址。 hashCode()方法的约定声明哈希码值不能更改。身份哈希码是...实际上......作为对象的一部分被记住,以便GC可以移动对象。

答案 1 :(得分:2)

根据定义,这是可能的。

identityHashCodeint。 Java中只有2个 32 不同的整数 您可以轻松编写一个程序,创建超过2个 32 对象。