App*_*sei 3 java integer short set
我不知道如何提出这个问题.但是,这两行代码之间有什么不同?
Set<Integer> a = new HashSet<Integer>();
for (int i = 0; i < 100; i++) {
a.add(i);
a.remove(i - 1);
}
System.out.println(a.size());
Run Code Online (Sandbox Code Playgroud)
我预计99将成为输出
输出为1
Set<Short> a = new HashSet<Short>();
for (Short i = 0; i < 100; i++) {
a.add(i);
a.remove(i - 1);
}
System.out.println(a.size());
Run Code Online (Sandbox Code Playgroud)
我预计99将成为输出
输出为100
Mar*_*nik 11
表达式的类型i - 1是int因为整数算术表达式中的所有操作数至少被加宽int.Set<Short>有add(Short)和remove(Object)如此有自动装箱需要在没有铸造/ remove通话.因此,您试图Integer从一组Shorts中删除s.
请注意,由于这个原因,声明一个Set<Number>:几乎没有意义:
final Set<Number> 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]
Run Code Online (Sandbox Code Playgroud)
作为奖励回合,如果您将设置实现更改为TreeSet,则魔法会消失并且会抛出一个ClassCastException,从而放弃技巧.
在内心深处,这个问题与平等是对称关系的事实有关,这种关系不能区分右手边和左手边.使用Java的单调度方法无法实现这些语义.