gpt4 book ai didi

java - 为什么 IdentityHashMap.keySet().removeAll(keys) 不使用标识?这是一个错误吗?

转载 作者:行者123 更新时间:2023-11-29 08:57:06 24 4
gpt4 key购买 nike

public static void main(String[] args) {
IdentityHashMap<Integer, Object> m1 = new IdentityHashMap<Integer, Object>();
Integer ONE = 1;
Integer TWO = 2;
Integer OTHER_ONE = new Integer(1);
Integer OTHER_TWO = new Integer(2);
m1.put(ONE, new Object());
m1.put(TWO, new Object());
System.out.println(m1.keySet()); // [1, 2]

m1.remove(OTHER_ONE); // Does not remove
System.out.println(m1.keySet()); // [1, 2]

m1.remove(ONE); // Does remove
System.out.println(m1.keySet()); // [2]

m1.keySet().removeAll(Arrays.asList(OTHER_TWO)); // ...
System.out.println(m1.keySet()); // [] WHAT?
}

此处引用IdentityHashMap.keySet()

我在源代码中找到了答案(见下文),但我不知道最终的原因。是错误吗?

最佳答案

我从 java 1.7.0_11 中找到了这个源代码

    public boolean removeAll(Collection<?> c) {
boolean modified = false;
for (Iterator<K> i = iterator(); i.hasNext(); ) {
if (c.contains(i.next())) {
i.remove();
modified = true;
}
}
return modified;
}

它使用 c.contains() 所以行为取决于集合类。我没有从 javadoc 中理解这一点。

我发现这是 6 年前报告的错误,但仍未解决!! http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6588783

关于java - 为什么 IdentityHashMap.keySet().removeAll(keys) 不使用标识?这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19682542/

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