繁体   English   中英

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

[英]Why does this code print 100 instead of 1?

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?

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

如果我...重命名你的类,在Set的初始化中使用Short而不是short ,然后使用......

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中不存在clear(你没有任何Integer对象!)

但是,如果我们改变s.remove(i - 1); s.remove((short)(i - 1)); ,我们强制将值转换回short ,然后将其作为new Short(i - 1)装箱,它确实存在于您的集合中,最终结果是它现在将打印1 ...

简单;)

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

暂无
暂无

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

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