Java HashSet和数据类型短,不兼容?

时间:2010-06-07 08:57:52

标签: java puzzle hashset short

运行此代码:

    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。

为什么要打印此值?

4 个答案:

答案 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类型不匹配。