System.identityHashCode() 对象被GC后是否能返回相同的hashCode
System.identityHashCode() can the same hashCode be returned after an Object is GC'ed
假设 System.identityHashCode(object1)==123
和 object1
被垃圾回收。新创建的 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 个对象的程序。
假设 System.identityHashCode(object1)==123
和 object1
被垃圾回收。新创建的 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 个对象的程序。