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

标签 java identity removeall

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/

相关文章:

java - 无法清除 JFrame

object - UFT 中的 Xpath 不工作

c# - AspNet Identity Core - 登录时的自定义声明

sql-server - SQL Server插入语句使用INSERTED获取新ID和现有ID

php - 如何使用 PHP 删除目录中除一个文件以外的所有文件?

java - 使用套接字将文件从 C++ 应用程序传输到 Java 应用程序

java - Vaadin Bakery App 中的登录验证如何进行

java - Android:应用程序在 WiFi 上工作,但既不在 3G 也不在 2G

java - Eclipse jar 导出和 lib 文件夹

c# - 如何使用Any()而不是RemoveAll()来排除列表项?