这是我刚刚遇到的一个很好的陷阱。考虑一个整数列表:
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))?这可能会导致一些讨厌的错误。
list.remove(1)
list.remove(new Integer(1))
在处理整数列表时,区分remove(int index)从给定索引中删除元素和通过引用删除元素的正确方法是什么?remove(Object o)
remove(int index)
remove(Object o)
这里要考虑的要点是 提到的——精确的参数匹配优先于自动装箱。
我不知道“正确”的方式,但你建议的方式工作得很好:
list.remove(int_parameter);
删除给定位置的元素和
list.remove(Integer_parameter);
从列表中删除给定对象。
这是因为 VM 首先尝试查找使用完全相同的参数类型声明的方法,然后才尝试自动装箱。
Java 总是调用最适合您的论点的方法。自动装箱和隐式向上转换仅在没有可以在没有强制转换/自动装箱的情况下调用的方法时执行。
List 接口指定了两个删除方法(请注意参数的命名):
这意味着list.remove(1)删除位置 1 的对象并remove(new Integer(1))从此列表中删除指定元素的第一次出现。
remove(new Integer(1))