Java:在 Set 中添加/删除短整型元素时输出不同

标签 java integer set short

我不确定如何问这个问题。但是,这两行代码有什么不同呢?

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());

我预计 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());

我预计 99 是输出

输出为100

最佳答案

表达式的类型 i - 1int因为整数算术表达式中的所有操作数都被扩展到至少 int . Set<Short>add(Short)remove(Object)所以 remove 不需要转换/自动装箱称呼。因此,您正试图删除 Integer来自一组 Short

请注意,由于这个原因,声明 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]

作为奖励回合,如果您将集合实现更改为 TreeSet , 魔法消失并抛出一个 ClassCastException , 给出了诀窍。

从根本上说,这个问题与相等是一种对称关系这一事实有关,它不能区分右手边和左手边。这些语义不可能用 Java 的单分派(dispatch)方法实现。

关于Java:在 Set 中添加/删除短整型元素时输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13366060/

相关文章:

java - 为什么 getRelativeTimeSpanString 需要 Context?

c# - 为简单变量设置 get set 有什么好处

python - 如何使用生成器表达式创建多个集合的并集?

c - 为什么 gdb "set"命令不能识别全局变量,必须添加 "::"或 "variable"?

java - properties.getProperty ("queryLocation")返回 null

java - HTTP 状态 500 - 在第 16 行处理 JSP page/trail.jsp 时发生异常

java - 我无法使用 Spring Security 登录

c++ - "Dividing"一个整数分成几 block (对某些收入阈值征收不同的税 - C++)

Java 1.7,时钟格式不起作用

java - 字符串无法转换为int数组和ASCII