为什么这段代码打印100而不是1?

时间:2014-07-29 09:36:54

标签: java

public class Short {
    public static void main(String[] args) {

        Set s = new HashSet();

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

        System.out.print(s.size());
    }

}

有谁可以告诉我为什么打印100而不是1?

2 个答案:

答案 0 :(得分:10)

似乎有一些自动装箱......那就是Java在Object和原始...之间自动转换......

如果我...重命名您的班级,请在初始化Short时使用short代替Set,然后使用...

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 ...但为什么?

要回答这个问题,我们需要仔细研究remove方法......

Set#remove(Object o)需要Object,而不是像add这样的通用类型,而是实际的Object ...当你执行i - 1时,Java会假定1是一个int,会自动将这些类型向上扩展,并自动将其设置为new Integer(i - 1) ... set中不存在明确的类型(您不需要)有任何Integer个对象!)

但是,如果我们将s.remove(i - 1);更改为s.remove((short)(i - 1));,我们会强制将值转换回short,然后将其自动生成为new Short(i - 1),这在您的身上确实存在设置,最终结果是它现在将打印1 ...

简单;)

答案 1 :(得分:2)

运行此代码后,我发现在将原始通用转换为java.lang.Short后,问题出在i-1时。 short - int会返回int,因此remove操作会尝试从Integer中删除sintshort以及IntegerShort分别非常不同。