我不知道如何提出这个问题.但是,这两行代码之间有什么不同?
Set a = new HashSet();
for (int i = 0; i < 100; i++) {
a.add(i);
a.remove(i - 1);
}
System.out.println(a.size());
我预计99将成为输出
输出为1
Set a = new HashSet();
for (Short i = 0; i < 100; i++) {
a.add(i);
a.remove(i - 1);
}
System.out.println(a.size());
我预计99将成为输出
输出为100
解决方法:
表达式i-1的类型是int,因为整数算术表达式中的所有操作数都被扩展为至少int.设置<短>添加(短)和删除(对象),因此删除调用不需要转换/自动装箱.因此,您试图从一组短裤中删除整数.
请注意,由于这个原因,声明一个Set< Number>几乎没有意义:
final Set ns = new HashSet<>();
final short s = 1;
ns.add(s);
ns.add(s+0);
ns.add(s+0L);
System.out.println(ns); // prints [1, 1, 1]
作为奖励回合,如果你将set实现更改为TreeSet,魔法就会消失并抛出ClassCastException,从而放弃技巧.
在内心深处,这个问题与平等是对称关系的事实有关,这种关系不能区分右手边和左手边.使用Java的单调度方法无法实现这些语义.
标签:java,integer,set,short
来源: https://codeday.me/bug/20190713/1446945.html