运行此代码:
public class SomeSet {
public static void main(String[] args) {
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。
为什么要打印此值?
答案 0 :(得分:10)
s.remove(i - 1);
上面的行将尝试从集合中删除Integer
个对象,因为Java中的所有整数计算都有int
(或long
)个结果。由于该集合包含Short
个对象,因此remove()
方法不会产生任何影响。
这(和类似的问题)是你几乎从不使用short
(以及更多,Short
)的主要原因。使用Set
实现来包含自动编码的数字会产生大量(容易1000%)的开销,因此使用Short
而不是Integer
来尝试节省空间毫无意义。
答案 1 :(得分:6)
问题在于remove(i-1)
使用remove
对象调用Integer
方法,因为i-1
属于int
类型(自动装入Integer
)。
要确保使用remove
对象致电Short
,请使用此<:p>
s.remove((short) (i - 1));
答案 2 :(得分:0)
i - 1
的类型为int
,因此会自动将其设置为整数。
通常,您希望通用集合可以防止您执行具有错误类型参数的操作,但Set<E>
的接口有点松散。
由于Set<E>
的{{3}}方法需要Object
而不是E
,因此编译器不会警告您要删除不同的类型该集包含。
要强制它为Short
,请将数值转换为(short)
。 (不允许转换为(Short)
,并且您必须转换数值以使用Short.valueOf
)
答案 3 :(得分:0)
请注意,add方法通常是boolean add(E o)
类型,所以在Set的情况下,add方法会很短,而remove方法通常不会输入boolean remove(Object o)
所以i - 1
autobox到整数。对于i new Short(i).equals(new Integer(i))
的任何值,将始终为false。
请注意,如果您尝试s.add(i - 1);
,您将收到编译器错误,因为i - 1
成为Integer的实例,并且Integer和Short类型不匹配。