奇怪的Java HashMap行为 – 找不到匹配的对象
发布时间:2020-12-15 05:04:55 所属栏目:Java 来源:网络整理
导读:当我试图在 java.util.HashMap中找到一个键时,我遇到了一些奇怪的行为,我想我错过了什么.代码段基本上是: HashMapKey,Value data = ...Key k1 = ...Value v = data.get(k1);boolean bool1 = data.containsKey(k1);for (Key k2 : data.keySet()) { boolean b
当我试图在
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; } 那个奇怪的循环是因为对于特定的执行我碰巧知道数据此时只包含一个项目并且它是k1,并且实际上bool2,bool3和bool4将在该执行中被评估为true.但是,bool1将被评估为false,而v将为null. 现在,这是一个更大的程序的一部分 – 我无法在较小的样本上重现错误 – 但在我看来,无论程序的其余部分做什么,这种行为都不应该发生. 编辑:我已手动验证哈希码在对象插入地图的时间和查询时间之间没有变化.我会继续检查这个场地,但还有其他选择吗? 解决方法
如果密钥的哈希码在插入映射后更改,则会发生此行为.
这是您描述的行为的示例: 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; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |