繁体   English   中英

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

[英]Java code using Set showing weird output?

根据我的逻辑,以下代码的输出应为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());

    }
}

的结果

i-1

int类型的。

这是在Java语言规范描述, 在这里

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

然后将此int装箱Integer以便用作Set#remove(Object)

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

答案在于装箱和自动装箱:

语句i-1的类型为int而不是Short类型。 方法remove()接受类型为Object的参数(不一定是集合的Generic类型)。 Java会将数字值自动装箱为整数。 在集合中找不到整数,因此不会将其删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM