我经常听说这些方法(Object.hashCode
and System.identityHashCode
) 返回对象的地址,或从地址快速计算出的内容;但我也很确定垃圾收集器会移动并压缩对象。由于哈希码无法更改,因此这就出现了问题。我知道这不是日常工作中需要了解的东西,但我想了解其内部原理。那么,有谁知道这是如何在Java中实现的吗?或者.NET,因为它们可能很相似。
.NET 的实现故意不发布(当您尝试反编译它时,您会发现它进行了非托管框架调用)。唯一的文档是here http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx,它仅声明“不保证为每个对象生成不同的值”,并且“可能会在框架版本之间发生变化”。对它的实际工作原理做出任何假设可能都是不明智的。
Java 的更容易理解(尽管可能在不同的 JVM 中可能有所不同),并且在这个问题中进行了专门讨论:由于权属空间的压缩,.hashcode() 会返回不同的 int 吗? https://stackoverflow.com/questions/3796699/will-hashcode-return-different-int-due-to-cmpaction-of-tenure-space
Java 实现的要点是,按照约定,对象的哈希码的值在第一次检索之前是不相关的。此后,它必须保持不变。因此,在第一次调用对象的 hashcode() 方法之前,GC 移动对象并不重要。之后,将使用缓存的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)