当我试图在里面寻找钥匙时,我遇到了一些奇怪的行为java.util.HashMap
,我想我错过了一些东西。代码段基本上是:
HashMap<Key, Value> data = ...
Key k1 = ...
Value v = data.get(k1);
boolean bool1 = data.containsKey(k1);
for (Key k2 : data.keySet()) {
boolean bool2 = k1.equals(k2);
boolean bool3 = k2.equals(k1);
boolean bool4 = k1.hashCode() == k2.hashCode();
break;
}
存在那个奇怪的 for 循环是因为对于具体执行我碰巧知道data
此时仅包含一项,它是k1
,而且确实bool2
, bool3
and bool4
将被评估为true
在那次执行中。bool1
,但是,将被评估为false
, and v
将为空。
现在,这是一个更大程序的一部分 - 我无法在较小的样本上重现错误 - 但在我看来,无论程序的其余部分做什么,这种行为都不应该发生。
EDIT:我已经手动验证了哈希码确实not对象插入到地图的时间和查询时间之间的变化。我会继续检查这个场地,但是还有其他选择吗?
如果将密钥插入到映射后更改密钥的哈希码,则可能会发生此行为。
这是您所描述的行为的示例:
public class Key
{
int hashCode = 0;
@Override
public int hashCode() {
return hashCode;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Key other = (Key) obj;
return hashCode == other.hashCode;
}
public static void main(String[] args) throws Exception {
HashMap<Key, Integer> data = new HashMap<Key, Integer>();
Key k1 = new Key();
data.put(k1, 1);
k1.hashCode = 1;
boolean bool1 = data.containsKey(k1);
for (Key k2 : data.keySet()) {
boolean bool2 = k1.equals(k2);
boolean bool3 = k2.equals(k1);
boolean bool4 = k1.hashCode() == k2.hashCode();
System.out.println("bool1: " + bool1);
System.out.println("bool2: " + bool2);
System.out.println("bool3: " + bool3);
System.out.println("bool4: " + bool4);
break;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)