Java HashSet remove(e)方法的行为与我的预期不符

时间:2014-04-24 10:59:47

标签: java collections

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

案例1:

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短集:[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]

我只是想了解这背后的主要原因,为什么这两个输出是不同的只是通过从更改为 int 。场景背后会发生什么。

2 个答案:

答案 0 :(得分:8)

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

你可以用演员来解决这个问题:

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

在您的第二个案例中,ii - 1都属于int类型(然后装箱为Integer),因此您输入的条目为{ #39;重新添加也可以删除...

答案 1 :(得分:1)

在第一个示例中,您尝试删除Integer,因为i-1表达式被提升为Integer。在你的HashSet中,你只有Shorts,这就是为什么它不会删除任何东西。

从Java 1.5开始,你不应该使用任何集合的原始类型。