Java 为什么IdentityHashMap.keySet().removeAll(键)不使用identity?是虫子吗? publicstaticvoidmain(字符串[]args){ IdentityHashMap m1=新IdentityHashMap(); 整数1=1; 整数二=2; 整数OTHER_ONE=新整数(1); 整数OTHER_TWO=新整数(2); m1.put(一个,新对象()); m1.put(两个,新对象()); System.out.println(m1.keySet());//[1,2] m1.移除(另一个);//不移除 System.out.println(m1.keySet());//[1,2] m1.删除(一);//是否删除 System.out.println(m1.keySet());//[2] m1.keySet().removeAll(Arrays.asList(OTHER_TWO));/。。。 System.out.println(m1.keySet());//[]什么? }

Java 为什么IdentityHashMap.keySet().removeAll(键)不使用identity?是虫子吗? publicstaticvoidmain(字符串[]args){ IdentityHashMap m1=新IdentityHashMap(); 整数1=1; 整数二=2; 整数OTHER_ONE=新整数(1); 整数OTHER_TWO=新整数(2); m1.put(一个,新对象()); m1.put(两个,新对象()); System.out.println(m1.keySet());//[1,2] m1.移除(另一个);//不移除 System.out.println(m1.keySet());//[1,2] m1.删除(一);//是否删除 System.out.println(m1.keySet());//[2] m1.keySet().removeAll(Arrays.asList(OTHER_TWO));/。。。 System.out.println(m1.keySet());//[]什么? },java,identity,removeall,Java,Identity,Removeall,此处引用 我在源代码中找到了答案(见下文),但我不知道最终的原因。这是一个bug吗?我从Java1.7.0\u11中找到了这个源代码 public static void main(String[] args) { IdentityHashMap<Integer, Object> m1 = new IdentityHashMap<Integer, Object>(); Integer ONE = 1; Integer TWO = 2; In

此处引用


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

我从Java1.7.0\u11中找到了这个源代码

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?
}
public boolean removeAll(集合c){
布尔修改=假;
for(迭代器i=Iterator();i.hasNext();){
if(c.contains(i.next())){
i、 删除();
修改=真;
}
}
修改返回值;
}
它使用的是c.contains(),因此行为取决于集合类。我从javadoc上看不懂

我发现这是6年前报告的一个bug,至今仍未解决!!
试试这个。它将说明发生了什么

    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;
    }
另一个是堆内存中的对象。一个不是对象,因此它驻留在常量池内存中


如果使用
new关键字
创建包装器对象,则只有它将进入堆内存,否则它将保存在常量池中

看,丹斯塔尔,我知道。我特意在这里使用new Integer()来测试映射的标识行为。我在问关于removeAll的事。问题还不清楚吗?谢谢。这个答案中有一个问题,所以也许可以将它合并到原始问题中。因为这不是问题的内容。MY-1是因为它不回答问题,一个也是对象,但你坚持(不要编辑)说它不是会让其他程序员困惑的东西。
  System.out.println(OTHER_ONE == ONE);
  System.out.println(Arrays.asList(OTHER_ONE).contains( ONE));