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...
简单;)