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

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提到的-精确的参数匹配优先于自动装箱。


当前回答

Java总是调用最适合你的参数的方法。自动装箱和隐式上强制转换只在没有可以调用的方法时执行。

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

删除(对象) 删除(int)

这意味着list.remove(1)删除位置1的对象,remove(new Integer(1))从列表中删除第一次出现的指定元素。

其他回答

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

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

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

你可以使用类型转换

list.remove((int) n);

and

list.remove((Integer) n);

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

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

Java总是调用最适合你的参数的方法。自动装箱和隐式上强制转换只在没有可以调用的方法时执行。

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

删除(对象) 删除(int)

这意味着list.remove(1)删除位置1的对象,remove(new Integer(1))从列表中删除第一次出现的指定元素。

我不知道“合适”的方式,但你建议的方式很好:

list.remove(int_parameter);

移除给定位置和的元素

list.remove(Integer_parameter);

从列表中移除给定对象。

这是因为VM首先试图找到声明了完全相同参数类型的方法,然后才尝试自动装箱。