Java HashSet remove(e) 方法不符合我的预期

标签 java collections

我无法理解其背后的逻辑。

案例一:

HashSet shortSet = new HashSet();
    for (short i = 0; i < 3; i++) {
        shortSet.add(i);
        shortSet.remove(i - 1);
    }
    System.out.println(shortSet.size() + "    shortSet : " + shortSet);

操作:大小:3 shortSet:[0, 1, 2]

案例 2:

HashSet shortSet = new HashSet();
    for (int i = 0; i < 3; i++) {
        shortSet.add(i);
        shortSet.remove(i - 1);
    }
    System.out.println("Size : "+shortSet.size() + "    shortSet : " + shortSet);

操作:大小:1 shortSet:[2]

我只是想了解这背后的主要原因,为什么这两个输出不同只需从 short 更改为 int 。幕后发生了什么。

最佳答案

问题在于,在第一种情况下,表达式 i 的类型为 short,而表达式 i - 1 的类型为整数。这些值分别装箱到 ShortInteger - Integer 不在集合中,因此无法删除。

你可以通过强制转换来解决这个问题:

for (short i = 0; i < 3; i++) {
    shortSet.add(i);
    shortSet.remove((short) (i - 1));
}

在您的第二个案例中,ii - 1 都是int 类型(然后装箱到Integer),因此您添加的条目也可以删除...

关于Java HashSet remove(e) 方法不符合我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23266975/

相关文章:

windows - java版本问题:(

与整数参数一起使用时,Java Color 创建会抛出 IllegalArgumentException

java - 编写java程序递归测试文件命名标准

ruby-on-rails - rails partials 中的收集计数器

java - 为什么 LinkedHashMap 类要实现 Map 接口(interface)?

java - Spring-boot 和 appengine

java - 使用堆栈(链表)评估 Postfix

java - 如何打印数组的三种不同类型的对象(其中可以存储任何类型的对象)并将其打印在单独的数组中?

oracle - PL/SQL 中的类映射对象类型?

java - 使用 weblogic 和 apache Camel 时 JVM 中出现 fatal error