为什么此代码打印100而不是1?

Dar*_*rio 4 java

public class Short {
    public static void main(String[] args) {

        Set s = new HashSet();

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

        System.out.print(s.size());
    }

}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么打印100而不是1?

Mad*_*mer 10

似乎有一些自动装箱......这是Java自动转换Object和原始...

如果我......重命名你的课程,请使用Short而不是short初始化,Set然后使用...

Set<Short> s = new HashSet<Short>();

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

System.out.println(s.size());
Run Code Online (Sandbox Code Playgroud)

它会打印100......但为什么呢?

要回答这个问题,我们需要仔细研究一下remove方法......

Set#remove(Object o)期望一个Object,而不是通用类型add,但实际Object......当你这样做时i - 1,Java假定它1是一个int并自动缩放类型并自动将其作为new Integer(i - 1)...清除内部不存在set(你不是有任何Integer对象!)

但是,如果我们s.remove(i - 1);改为s.remove((short)(i - 1));,我们强制将值转换回short然后自动生成,因为new Short(i - 1)它确实存在于您的集合中,最终结果是它现在将打印1...

简单;)