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 来节省空间是毫无意义的。

【讨论】:

... 或 floatdouble ;-)【参考方案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&lt;E&gt; 的接口有点松散。

因为Set&lt;E&gt; 的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类型想加为啥会成为int型

哪位高手来解决一下:java中short类型数据如何转换成boolean类型???

java 详细介绍short,byte,char三种类型,我分不清

java 数据类型整理

JAVA基本类型和引用类型

6short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?-Java面试题答案