默认哈希码是否在对象变异上发生变化

时间:2012-08-04 08:50:15

标签: java hashmap hashcode

我知道hashmap键应该是不可变对象,或者至少具有一致的哈希码,以便从Map / Set中正确检索其值。但是如果我使用变异对象作为键而不重写哈希码或等号,那么它的哈希码是否会在生命周期中保持一致。我试过它来检索一个变异对象的哈希码,并且总是发现它一致。

4 个答案:

答案 0 :(得分:4)

contract for hashcode州:

  

每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,如果对象的等比较中没有使用的信息被修改

因此,如果您改变对象,则无法保证哈希码不会改变。碰巧有些JDK实现可能会使用某种内部地址but they don't have to,所以你不应该依赖它。

答案 1 :(得分:2)

在最新版本的HotSpot JVM中,对象的默认哈希码不会随时间而改变。实际上,哈希代码是从初始分配地址派生的,并在对象头中输入(参见JVM Whitepaper),因为对象由垃圾收集器移动,之后不会改变。

答案 2 :(得分:0)

是的,如果你不覆盖hashCode方法,它将是常量。默认的hashCode是内存中对象的原始位置。通过此方法检索此内存位置:

System.identityHashCode(Object)

在StackOverflow上查看此主题:

How does the JVM ensure that System.identityHashCode() will never change?

答案 3 :(得分:0)

hashcode的默认Java实现基于指向对象的指针,因此在更改实例变量时不应更改。

修改

但Martijn打败了我。