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

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

当你执行list.remove(1)时会发生什么?列表呢?remove(新的整数(1))?这可能会导致一些讨厌的bug。

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


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


当前回答

简单地说,我喜欢遵循#decitrig在接受的回答第一条评论中的建议。

list.remove(Integer.valueOf(intereger_parameter));

这对我很有帮助。再次感谢#decitrig的评论。它可能对某些人有帮助。

其他回答

当你执行list.remove(1)时会发生什么?列表呢?remove(新的整数(1))?

没有必要猜测。第一种情况将导致调用List.remove(int),位置1的元素将被移除。第二种情况将导致调用List.remove(Integer),值等于Integer(1)的元素将被删除。在这两种情况下,Java编译器都会选择最接近的匹配重载。

是的,这里有可能出现混乱(和bug),但这是一个相当不常见的用例。

当二名单。remove方法是在Java 1.2中定义的,重载是明确的。这个问题是在Java 1.5中引入泛型和自动装箱后才出现的。事后看来,如果其中一个删除方法被赋予不同的名称,效果会更好。但现在已经太晚了。

list.remove(4)是list的精确匹配。Remove (int index),因此它将被调用。如果你想调用list.remove(Object),请执行以下操作:list.remove((Integer)4)。

你可以使用类型转换

list.remove((int) n);

and

list.remove((Integer) n);

不管n是int还是Integer,该方法总是会调用您所期望的方法。

使用(Integer) n或Integer. valueof (n)比新的Integer(n)更有效,因为前两者可以使用Integer缓存,而后者总是创建一个对象。

注意,即使虚拟机没有做正确的事情,你仍然可以通过使用remove(java.lang.Object)操作任意对象来确保正确的行为:

myList.remove(new Object() {
  @Override
  public boolean equals(Object other) {
    int k = ((Integer) other).intValue();
    return k == 1;
  }
}

简单地说,我喜欢遵循#decitrig在接受的回答第一条评论中的建议。

list.remove(Integer.valueOf(intereger_parameter));

这对我很有帮助。再次感谢#decitrig的评论。它可能对某些人有帮助。