栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

由于权属空间的压缩,.hashcode()将返回不同的int吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

由于权属空间的压缩,.hashcode()将返回不同的int吗?

@erickson或多或少是正确的。返回的哈希码

java.lang.Object.hashCode()
在对象的生存期内不变。

(通常)实现此方法的方式非常聪明。当对象由垃圾回收器重定位时,其原始哈希码必须存储在某个地方,以防再次使用。实现此目的的明显方法是将32位字段添加到对象标头中以保存哈希码。但这会给每个对象增加1个字的开销,并且在最常见的情况下会浪费空间…在这种情况下,

hashCode
不会调用对象的方法。

解决方案是将两个标志位添加到对象的标志字中,并按如下方式(大致)使用它们。

hashCode
调用方法时设置第一个标志。第二个标志告诉该
hashCode
方法是使用对象的当前地址作为哈希码,还是使用存储的值。当GC运行并重定位对象时,它将测试这些标志。如果设置了第一个标志而未设置第二个标志,则GC在对象的末尾分配一个额外的单词,并将原始对象位置存储在该单词中。然后,它设置两个标志。从此以后,该
hashCode
方法从对象末尾的单词获取哈希码值。


实际上,

identityHashCode
实现 必须以这种方式
来满足常规hashCode合同的以下部分:

“只要在Java应用程序执行期间在同一对象上多次调用它,hashCode方法
就必须一致地返回相同的整数,只要没有修改该对象的equals比较中使用的信息即可 。一个应用程序的执行到同一应用程序的另一个执行。”

如果/当GC将对象移至其他地址时,假设的实现

identityHashCode()
仅返回对象的 当前
机器地址将违反突出显示的部分。解决此问题的唯一方法是(假想的)JVM确保一旦
hashCode
调用对象就永远不会移动它。这将导致堆碎片的严重而棘手的问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469580.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号