[英]Why does this code print 100 instead of 1?
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());
}
}
谁能告诉我为什么打印100而不是1?
似乎有一些自动装箱......那就是Java在Object
和原语之间自动转换......
如果我...重命名你的类,在Set
的初始化中使用Short
而不是short
,然后使用......
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());
它将打印100
...但为什么?
要回答这个问题,我们需要仔细研究一下remove
方法......
Set#remove(Object o)
需要一个Object
,而不是像add
那样的泛型类型,而是一个实际的Object
...当你做i - 1
,Java假设1
是一个int
并自动缩放类型并自动将其设置为new Integer(i - 1)
...在set
中不存在clear(你没有任何Integer
对象!)
但是,如果我们改变s.remove(i - 1);
到s.remove((short)(i - 1));
,我们强制将值转换回short
,然后将其作为new Short(i - 1)
装箱,它确实存在于您的集合中,最终结果是它现在将打印1
...
简单;)
在运行此代码后,我发现在将原始泛型转换为java.lang.Short
,问题出在你执行i-1
。 short
- int
返回int
,因此remove
操作尝试从s
删除Integer
。 int
和short
,以及Integer
和Short
分别非常不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.