从列表中正确删除整数<整数>

2022-08-31 06:03:46

这是我刚刚遇到的一个很好的陷阱。考虑一个整数列表:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(6);
list.add(7);
list.add(1);

关于执行时会发生什么的任何有根据的猜测?怎么样?这可能会导致一些令人讨厌的错误。list.remove(1)list.remove(new Integer(1))

在处理整数列表时,区分 remove(int index) (从给定索引中删除元素) 和 remove(Object o)(通过引用删除元素) 的正确方法是什么?


这里要考虑的要点是@Nikita提到的一点 - 精确参数匹配优先于自动装箱。


答案 1

Java 总是调用最适合你的参数的方法。自动装箱和隐式上放只有在没有方法的情况下才能调用而无需投射/自动装箱时执行。

List 接口指定了两个删除方法(请注意参数的命名):

  • remove(Object o)
  • remove(int index)

这意味着 将删除位置 1 处的对象,并从此列表中删除指定元素的第一个匹配项。list.remove(1)remove(new Integer(1))


答案 2

您可以使用转换

list.remove((int) n);

list.remove((Integer) n);

无论 n 是 int 还是 Integer,该方法将始终调用您期望的那个。

使用 or 比前两个更有效,前者可以使用 Integer 缓存,而后者将始终创建一个对象。(Integer) nInteger.valueOf(n)new Integer(n)