我知道hashmap键应该是不可变对象,或者至少具有一致的哈希码,以便从Map / Set中正确检索其值。但是如果我使用变异对象作为键而不重写哈希码或等号,那么它的哈希码是否会在生命周期中保持一致。我试过它来检索一个变异对象的哈希码,并且总是发现它一致。
答案 0 :(得分:4)
每当在执行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打败了我。