Java Map Implementation不基于HashCode

Fra*_*eth 5 java

是否有一些java.util.Map不使用HashCode的实现?

我有以下问题:

  1. 我在HashMap上存储与另一个对象关联的对象;
  2. 从步骤1中使用的密钥对象更改属性;
  3. 由于哈希码用于在HashMap的常规实现上存储键,当我执行get()on时HashMap,我得到null,因为旧对象hashCode在步骤1中是不同的.

有解决方案吗?或者我应该只为我的equals/hashCode方法使用不可变字段?

Mar*_*eel 9

IdentityHashMap使用Object标识而不是hashCode; 但这确实意味着您需要用作键的原始对象来检索地图的值.其他选项是重新定义哈希码以排除对象的可变部分,或者 - 如果由于某种原因无法重新定义hashCode - 将对象包装在另一个提供稳定hashCode的对象中.


ska*_*man 7

建议您使用不可变密钥,并将键/值对重新插入Map,而不是在原位改变密钥.正如您所发现的那样,这只会导致奇怪的错误.

如果这不是您的选项,那么请查看是否可以忽略方法中的mutable属性hashCode(),以便哈希代码不会更改.但是,如果这是该课程的唯一属性,那不是一个好主意.

可以使用TreeMap,我不认为使用hashCode().但是,它确实需要密钥compareTo()equals()方法之间的一致性,因此如果这些方法的返回值可以更改,您可能会遇到与以前相同的问题.