为什么可以循环TreeMap的keySet
并获得.containsKey == false
?
for (Object thisObject : map.keySet()) {
if (!map.containsKey(thisObject)) {
System.out.println("This line should be never reached.");
}
}
经过大量不同的迭代和调用后,这条线就被击中了。CCD_ 3将返回CCD_。但是调试显示键(相同的引用、值和散列)和实际值在映射中。该地图是一个小型(25个元素)TreeMap<Long, Double>
更新:
正如@rgettman猜测的那样,在构建TreeMap时使用了一个自定义排序Comparator
(没有看到它,因为它是从另一个类构建的)。这个比较器只是(我想)从这里粘贴的副本
更改Comparator
:
public int compare(Object a, Object b) {
if((Double)base.get(a) > (Double)base.get(b)) {
return 1;
} else if((Double)base.get(a) == (Double)base.get(b)) {
return 0;
} else {
return -1;
}
}
至
...
} else if(base.get(a).equals(base.get(b))) {
return 0;
...
修复了问题。这个问题之所以在数百万次操作后才出现,是因为在这种情况下,映射中没有两个不同键的两个相似值,因为这在上下文中是不太可能的。
因此:
25151l, 1.7583805400614032
24827l, 1.7583805400614032
它失败了。
感谢您的帮助
您必须对后备entrySet()/Map.Entry
进行更改,从而更改密钥顺序,从而导致搜索containsKey
失败。
我刚刚执行了代码,这个案例确实向我返回了true。
TreeMap<Long,Double> otm = new TreeMap<Long, Double>();
otm.put(1L, 1.0);
otm.put(2L, 2.0);
for (Object thisObject : otm.keySet()) {
System.out.println(otm.containsKey(thisObject));
}
你能给我们你在树图中输入的数据吗。感谢
这是来自JavaDocs 的containKey(对象密钥)实现
包含密钥
boolean containsKey(Object key)
如果此映射包含指定键的映射,则返回true。
更正式地说,当且仅当此映射包含映射时返回true对于密钥k,(key==null?k==null:key.equals(k))最多可以是一个这样的映射。)
参数:
key - key whose presence in this map is to be tested Returns: true if this map contains a mapping for the specified key Throws: ClassCastException - if the key is of an inappropriate type for this map (optional) NullPointerException - if the specified key is null and this map does not permit null keys (optional
希望能有所帮助。
这些实现类中的大多数都依赖于支持和正确的hashCode()和equals()。
若您确实有来自对象的相同散列代码,请尝试匹配相等。我提出的答案是它们不匹配。
否则,场景应该足够小,以便发布对象和/或它们各自的hashcode和equals方法。