当前位置: 首页 > 面试题库 >

Java:在集合中添加/删除短整数和整数元素时,输出不同

巴洲
2023-03-14
问题内容

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

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因为整数算术表达式中的所有操作数都至少扩展为intSet<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]

作为奖励回合,如果将set实现更改为TreeSet,则魔术消失,并且抛出a ClassCastException,从而放弃了把戏。

从深处看,这个问题与平等是对称关系这一事实有关,它不能区分右手侧和左手侧。使用Java的单调度方法无法实现这些语义。



 类似资料:
  • 问题内容: AFAIK有两种方法: 遍历集合的副本 使用实际集合的迭代器 例如, 和 是否有任何理由偏爱一种方法(例如,出于可读性的简单原因而偏爱第一种方法)? 问题答案: 让我举几个例子,并提出一些避免方案。 假设我们有以下藏书 收集并删除 第一种技术是收集所有要删除的对象(例如,使用增强的for循环),并在完成迭代后删除所有找到的对象。 假设你要执行的操作是“删除”。 如果要“添加”此方法也可

  • 问题内容: 考虑以下代码: 编译产生错误 因为表达式i / j的类型显然是int,因此必须将其强制转换为short。 为什么类型不短? 问题答案: 从Java规范: 5.6.2二进制数值提升 当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个数值类型的值,以下规则按顺序适用,并根据需要使用加宽转换(第5.1.2节)来转换操作数: 如果一个操作数的类型为double,则另一个将转换为

  • AFAIK,有两种方法: 迭代集合的副本 使用实际集合的迭代器 例如, 而且 有没有理由偏爱一种方法而不是另一种方法(例如,由于可读性的简单原因而偏爱第一种方法)?

  • 整数集合(intset)用于有序、无重复地保存多个整数值, 根据元素的值, 自动选择该用什么长度的整数类型来保存元素。 举个例子, 如果在一个 intset 里面, 最长的元素可以用 int16_t 类型来保存, 那么这个 intset 的所有元素都以 int16_t 类型来保存。 另一方面, 如果有一个新元素要加入到这个 intset , 并且这个元素不能用 int16_t 类型来保存 —— 比

  • 当我点击一个座位时,如何防止重复,这样当我再次点击它时,它就不会追加,而是连续删除/添加。 参见输出的图片

  • 当我点击一个座位时,如何防止重复,这样当我再次点击它时,它就不会追加,而是连续删除/添加。 参见输出的图片