Java HashSet和数据类型Short,不兼容?
Posted
技术标签:
【中文标题】Java HashSet和数据类型Short,不兼容?【英文标题】:Java HashSet and data type Short, incompatibility? 【发布时间】:2010-06-07 08:57:52 【问题描述】:运行此代码:
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。
为什么要打印这个值?
【问题讨论】:
【参考方案1】:s.remove(i - 1);
上面的行将尝试从集合中删除Integer
对象,因为Java 中的所有整数计算都有int
(或long
)结果。由于该集合中包含Short
对象,因此remove()
方法将不起作用。
这个(和类似的问题)是你几乎不应该使用short
(更重要的是Short
)的主要原因。使用 Set
实现来包含自动装箱的数字会产生大量(很容易 1000%)开销,因此尝试使用 Short
而不是 Integer
来节省空间是毫无意义的。
【讨论】:
... 或float
或 double
;-)【参考方案2】:
问题在于remove(i-1)
使用Integer
对象调用remove
方法,因为i-1
的类型为int
(它会自动装箱为Integer
)。
要确保您使用 Short
对象调用 remove
,请使用:
s.remove((short) (i - 1));
【讨论】:
或更明确的 s.remove(Short.valueOf(i-1)); @Steve:它不会编译,因为您还需要显式转换。使其更明确但也更详细。【参考方案3】:i - 1
的类型是int
,因此它会自动装箱为整数。
通常你会期望一个泛型集合来阻止你执行带有错误类型参数的操作,但是Set<E>
的接口有点松散。
因为Set<E>
的remove 方法采用Object
而不是E
,所以编译器不会警告您正在删除与集合所含内容不同的类型。
要将其强制为Short
,请将数值转换为(short)
。 (不允许转换为(Short)
,您必须转换数值才能使用Short.valueOf
)
【讨论】:
【参考方案4】:请注意,add 方法的一般类型为 boolean add(E o)
,因此在您的 Set 情况下,add 方法将采用一个简短的类型,而 remove 方法通常不是 boolean remove(Object o)
,因此 i - 1
自动装箱为整数。对于 i 的任何值,new Short(i).equals(new Integer(i))
将始终为 false。
请注意,如果您尝试 s.add(i - 1);
,您将收到编译器错误,因为 i - 1
成为 Integer 的实例,并且类型 Integer 和 Short 不匹配。
【讨论】:
以上是关于Java HashSet和数据类型Short,不兼容?的主要内容,如果未能解决你的问题,请参考以下文章
哪位高手来解决一下:java中short类型数据如何转换成boolean类型???
java 详细介绍short,byte,char三种类型,我分不清
6short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?-Java面试题答案