使用Set的Java代码显示奇怪的输出?

时间:2014-10-10 03:18:05

标签: java algorithm

根据我的逻辑,以下代码的输出应为1。但它显示100而不是。任何人都可以解释我的问题在哪里?

  /* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        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());

    }
}

2 个答案:

答案 0 :(得分:4)

的结果
i-1

的类型为int

Java语言规范here中描述了这一点。

  

对操作数执行二进制数字提升(第5.6.2节)。

int值会boxed变为Integer,以便用作Set#remove(Object)的参数。

remove(Object)方法然后使用此Integer对象与Set中的元素进行比较,使用Object#equals(Object)。但Short equals Integer Integer equal Short没有{{1}} {{1}} {{1}}。因此没有任何东西被删除。

答案 1 :(得分:2)

答案在于out-and autoboxing:

声明i-1的类型int不是Short类型。 方法remove()接受类型为Object的参数(不一定是集合的泛型类型)。 Java会将数值自动打包为整数。无法在集合中找到整数,因此不会将其删除。