一尘不染

如果Java的垃圾回收器移动对象,那么Object.hashCode和System.identityHashCode是什么?

java

我经常听到这些方法(Object.hashCodeSystem.identityHashCode)返回对象的地址,或者从该地址快速计算出的值;但是我也很确定垃圾收集器会移动并压缩对象。由于哈希码不能改变,因此存在问题。我知道这不是日常工作中需要了解的内容,但我想了解内部知识。那么,有谁知道这是如何用Java实现的?或.NET,因为它们可能相似。


阅读 261

收藏
2020-12-03

共1个答案

一尘不染

.NET的实现有意未发布(当您尝试对其进行反编译时,您会发现它进行了非托管框架调用)。这样的唯一文档在这里,它仅声明“不能保证为每个对象产生不同的值”,并且“可以在框架版本之间进行更改”。对它的实际工作方式做任何假设可能都是不明智的。

Java的理解更充分(尽管可能在JVM之间可能有所不同),并且在以下问题中专门介绍了Java:[由于使用权空间的压缩,.hashcode()是否会返回不同的int?

Java实现的要点是,根据合同,对象的哈希码的值在第一次检索之前是不相关的。在那之后,它必须保持恒定。因此,在第一次调用对象的hashcode()方法之前,移动对象的GC无关紧要。之后,将使用缓存的值。

2020-12-03