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

Com*_*ted 3 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);
Run Code Online (Sandbox Code Playgroud)

操作:大小: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);
Run Code Online (Sandbox Code Playgroud)

操作:大小:1短集:[2]

我只是想了解这背后的主要原因,为什么这两个输出是不同的Just By从short变为int.场景背后会发生什么.

Jon*_*eet 8

问题是在第一种情况下,表达式i是类型short,而表达式i - 1是类型int.这些值被装箱到ShortInteger分别-的Integer是不在集合中,所以不能被去除.

您可以使用强制转换修复此问题:

for (short i = 0; i < 3; i++) {
    shortSet.add(i);
    shortSet.remove((short) (i - 1));
}
Run Code Online (Sandbox Code Playgroud)

在你的第二个情况下,无论是ii - 1有型的int(当时盒装到Integer),所以也可以被删除您要添加的条目...