假设6713707
和System.identityHashCode(object1)==123
被垃圾收集。是否有可能新创建的object1
具有相同的标识,其代码与object2
之前的代码相同?
答案 0 :(得分:4)
新创建的object2是否有可能具有相同的标识,其代码与它在GC之前获得的对象相同?
是的。
身份哈希码(通常)是在首次为对象调用方法时从对象的地址派生的。如果GC在计算哈希码后移动scala.slick.codegen.SourceCodeGenerator
,则可以在以前用于object1
的地址处分配新对象(object2
)。然后,您可以使object1
和object1
具有相同的哈希码...尽管object2
和object1
是不同的对象(根据object2
)。< / p>
它们是哈希码...不是对象的唯一标识符。
我对身份的理解是,对象在给定时间点在JVM内部是唯一的。
身份是独一无二的。身份哈希码不是。正如==
javadoc所说:
“尽可能合理,Object类定义的
Object
方法确实为不同的对象返回不同的整数。”
这远不是唯一性的保证。
然后:
“(这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。)”
它所指的是首次调用hashCode
时对象的地址。 hashCode()
方法的约定声明哈希码值不能更改。身份哈希码是...实际上......作为对象的一部分被记住,以便GC可以移动对象。
答案 1 :(得分:2)
根据定义,这是可能的。
identityHashCode
是int
。 Java中只有2个 32 不同的整数
您可以轻松编写一个程序,创建超过2个 32 对象。