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

Eme*_*ald 5 java puzzle short hashset

运行此代码:

    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());

    }

}
Run Code Online (Sandbox Code Playgroud)

将打印值100.

为什么打印这个值?

Mic*_*rdt 10

s.remove(i - 1);
Run Code Online (Sandbox Code Playgroud)

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

这(以及类似的问题)是你几乎从不使用short(以及更多)的主要原因Short.使用Set包含自动编码的数字的实现会产生大量(容易1000%)的开销,因此尝试通过使用Short而不是使用来节省空间是没有意义的Integer.


Joa*_*uer 7

问题是用一个对象remove(i-1)调用该remove方法Integer,因为i-1它是类型int(它被自动装入一个Integer).

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

s.remove((short) (i - 1));
Run Code Online (Sandbox Code Playgroud)