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?
答案 0 :(得分: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());
它会打印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
...
简单;)
答案 1 :(得分:2)
运行此代码后,我发现在将原始通用转换为java.lang.Short
后,问题出在i-1
时。 short
- int
会返回int
,因此remove
操作会尝试从Integer
中删除s
。 int
和short
以及Integer
和Short
分别非常不同。