根据我的逻辑,以下代码的输出应为1。但它显示100而不是。任何人都可以解释我的问题在哪里?
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
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());
}
}
答案 0 :(得分:4)
的结果
i-1
的类型为int
。
Java语言规范here中描述了这一点。
对操作数执行二进制数字提升(第5.6.2节)。
此int
值会boxed变为Integer
,以便用作Set#remove(Object)
的参数。
remove(Object)
方法然后使用此Integer
对象与Set
中的元素进行比较,使用Object#equals(Object)
。但Short
equals
Integer
Integer
equal
Short
没有{{1}} {{1}} {{1}}。因此没有任何东西被删除。
答案 1 :(得分:2)
答案在于out-and autoboxing:
声明i-1的类型int
不是Short
类型。
方法remove()
接受类型为Object
的参数(不一定是集合的泛型类型)。 Java会将数值自动打包为整数。无法在集合中找到整数,因此不会将其删除。