System.identityHashCode() 对象被GC后是否能返回相同的hashCode

System.identityHashCode() can the same hashCode be returned after an Object is GC'ed

假设 System.identityHashCode(object1)==123object1 被垃圾回收。新创建的 object2 是否有可能与 object1 在被 GC 之前具有相同的身份哈希码?

Is it possible that a new created object2 can have the same identity hash code as object1 got before it was GC'ed ?

是的。

身份哈希码 可能 派生 从对象的地址首次调用该方法时。 (或者它 可能 以其他方式生成。规范允许使用许多不同的机制。)

所以,如果GC回收了object1,一个新的对象object2被分配到与原来相同的地址,而新的可能 与原始哈希码相同。

此外,如果GC 移动 object1,在hashcode生成后,新对象(object2)在object1'是原创的。然后,您可能会得到两个具有相同哈希码的 existing 个对象。

但这些都应该不是问题。哈希码并非设计为对象的标识符。 (所以不要尝试这样使用它们。)


My understanding of identity is that objects are unique inside a JVM at a given point in time.

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

"As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects."

这远不能保证唯一性。

然后:

"(This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.)"

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

请注意,最新的 javadocs 已经删除了所有关于如何生成或可能生成身份哈希码的提及。此更改发生在 Java 12

根据定义,这是可能的。

identityHashCode 是一个 int。在Java.
中只有232个不同的整数 您可以轻松编写创建超过 232 个对象的程序。