Java面试谜题:与集合相关的问题

5

我面试遇到了以下问题。

下面的代码会输出什么结果。

package com.demo;

import java.util.HashSet;
import java.util.Set;

public class Test {

    public static void main(String[] args) {
    Set<Short> set=new HashSet<Short>();

        for (short i = 0; i < 10; i++){
            set.add(i);
            set.remove(i-1);
        }

        System.out.println(set.size());
    }
}

它的输出结果是:10

但我对它为什么会输出10感到困惑。

请问有人能解释一下这里发生了什么吗?

谢谢!

SItansu

2个回答

5

表达式i-1的类型为int并自动装箱为Integer对象,因此程序将Short对象添加到集合中,然后尝试删除Integer对象。该集合中没有Integer对象,因此永远不会删除任何东西。


5
字面值 1 的类型是 int。因此,i - 1 的类型也是 int,而不是 short。所以你向集合中添加的是 Short 类型的包装实例,而删除的是 Integer 类型的包装实例。由于Short并不等于Integer,所以 remove() 方法没有删除任何内容。请注意保留HTML标记。

1
值得注意的是,即使是针对Set<T>类型,由于remove被定义为接受Object类型的参数,因此您不会收到类型不匹配的警告或错误。 - Michael Anderson
编译器确实很高兴。然而,我的IDE(IntelliJ)足够聪明,可以警告我这个可能的错误。 - JB Nizet
啊,我现在正在使用 Eclipse,但它对此没有任何显示。唉,可能有一个设置可以解决这个问题... - Michael Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接