gpt4 book ai didi

java - 奇怪的 Java HashMap 行为 - 找不到匹配的对象

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:35 35 4
gpt4 key购买 nike

尝试在 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,实际上 bool2bool3bool4 将在该执行中被评估为 true。但是,bool1 将被评估为 false,并且 v 将为 null。

现在,这是一个更大程序的一部分——我无法在更小的样本上重现错误——但在我看来,无论程序的其余部分做什么,这种行为都不应该发生。

编辑:我已手动验证哈希码在对象插入 map 和查询之间没有发生变化。我会继续查看这个 field ,但还有其他选择吗?

最佳答案

如果 key 的哈希码在插入到 map 后发生更改,则可能会发生此行为。

这是您描述的行为的示例:

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;
}
}
}

关于java - 奇怪的 Java HashMap 行为 - 找不到匹配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3357278/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com