5

运行此代码:

    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

4 回答 4

10
s.remove(i - 1);

上面的行将尝试Integer从集合中删除对象,因为 Java 中的所有整数计算都有int(或long)结果。由于该集合包含Short对象,因此该remove()方法不会有任何效果。

这个(和类似的问题)是你几乎不应该使用的主要原因short(而且,更是如此Short)。使用Set包含自动装箱数字的实现会产生大量(很容易 1000%)开销,因此尝试使用Short而不是Integer.

于 2010-06-07T09:02:37.683 回答
7

问题是用一个对象remove(i-1)调用该remove方法,因为它是类型(它被自动装箱成一个)。Integeri-1intInteger

要确保您remove使用Short对象调用,请使用以下命令:

s.remove((short) (i - 1));
于 2010-06-07T09:03:28.063 回答
0

请注意,add 方法是一般类型boolean add(E o)的,因此在您的 Set 情况下,add 方法将需要一个简短的,而 remove 方法不是一般类型的boolean remove(Object o),因此i - 1自动装箱为 Integer。对于 i 的任何值new Short(i).equals(new Integer(i))将始终为假。

请注意,如果您尝试s.add(i - 1);,您将收到编译器错误,因为i - 1成为 Integer 的实例并且 Integer 和 Short 类型不匹配。

于 2010-06-07T09:16:24.740 回答
0

的类型i - 1int,因此它被自动装箱为整数。

通常你会期望一个泛型集合来阻止你执行具有错误类型参数的操作,但是接口Set<E>有点松散。

因为remove方法Set<E>采用 anObject而不是 an E,所以编译器不会警告您正在删除与 set 包含的内容不同的类型。

要将其强制为Short,请将数值转换为(short)。((Short)不允许转换为,您必须转换数值才能使用Short.valueOf

于 2010-06-07T09:09:30.107 回答