如果你没有重写对象的HashCode方法,使用的是Object的native int hashCode()
,那么返回的hashCode就是identityHashCode,即使重写了HashCode,也可以通过System.identityHashCode(Object x)获得identityHashCode。也许你可以重写hashCode()方法让对象在不同状态返回不同的Hash值,但是一个对象的identityHashCode一经计算就永远不会改变。identityHashCode会在第一次计算时存入对象头中的MarkWord结构中,后续再获取identityHashCode就会直接返回MarkWord中记录的,而重写的HashCode并不会存入MarkWord。这也是为什么都说对象的identityHashCode和地址相关,但是明明对象会因为GC而移动改变存储位置,返回的identityHashCode却永远相同,就是因为identityHashCode只与它第一次计算时的地址有关,后续返回的都是存在MarkWorde的identityHashCode值。
【小笔记】identityHashCode
最新推荐文章于 2022-11-28 15:15:06 发布