gpt4 book ai didi

java - hashcode的Object类默认实现是否使用identityhashcode

转载 作者:行者123 更新时间:2023-12-01 22:32:30 24 4
gpt4 key购买 nike

我的问题是:hashcode 的 Object 类默认实现是否使用 Identityhashcode ?我认为确实如此。如果不正确,请纠正我。

假设这里确实是我的问题:假设一个对象的 hashCode() 被调用一次,在堆压缩期间被重新定位(并用它存储identityhashcode),并且在第一个对象的旧位置创建一个新的不同对象。在这种情况下,即使对象不同,两个对象的 IdentityHashCode 也将相同。这该如何解释呢?

最佳答案

据我了解,一些Java实现通过在对象头中保留两位来将对象分为三类来实现identityHashCode:

  1. 从未调用过 identityHashCode() 的内容。

  2. 在最近一次对象移动之后首次调用 identityHashCode() 的对象。

  3. 首次调用 identityHashCode() 发生在最近一次对象移动之前的对象。

对于第一类对象,调用identityHashCode()将返回与对象地址相关的值,并设置一个标志以将对象更改为第二类。对于第二类中的对象,identityHashCode() 将从地址中计算出与第一次调用相同的值。每当 GC 要移动对象时,它都会检查该对象是否属于上面的第二类。如果是这样,GC 在目标处保留额外的 4 个字节,用于保存对象在移动之前拥有的身份哈希值。

如果某个对象的哈希码已被获取,则下次 GC 必须移动该对象时,该对象的有效大小将增加 4 个字节。然而,大多数对象从未获取其身份哈希代码,其中一些对象获取了其身份哈希代码,但立即被收集。让对象第一次调用identityHashCode() 为对象分配额外的四个字节会很困难,但在移动对象时分配额外的四个字节不是问题。在第一次调用 identityHashCode() 和下一次对象移动之间使用对象的地址作为其哈希值,可以避免在使用对象后面的空间时分配存储。

请注意,虽然身份哈希方法可以直接“合法”使用地址的位模式,但这样做可能会导致过多的哈希重复(例如,在一个 GC 周期后创建的第一个对象很容易与该对象具有相同的地址)第一个对象创建后又创建)。避免该问题的一个简单方法是让系统将地址与每个 GC 周期后都会更改的值相加、异或或以其他方式组合。这种方法可以轻松地将哈希值传播到更广泛的范围。

关于java - hashcode的Object类默认实现是否使用identityhashcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27425432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com