这是我刚刚遇到的一个很好的陷阱。考虑一个整数列表:
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))
呢?这会导致一些令人讨厌的bug。
在处理整数列表时,区分remove(int index)
(从给定索引中删除元素)和remove(Object o)
(通过引用删除元素)的正确方法是什么?
这里要考虑的要点是@Nikita mentioned精确参数匹配优先于自动装箱。
发布于 2010-12-26 22:31:15
您可以使用强制转换
list.remove((int) n);
和
list.remove((Integer) n);
N是int还是Integer都无关紧要,该方法将始终调用您期望的值。
使用(Integer) n
或Integer.valueOf(n)
比使用new Integer(n)
更有效,因为前两者可以使用整数缓存,而后者总是创建对象。
发布于 2010-12-26 22:29:37
我不知道什么是“适当”的方式,但你建议的方式很好:
list.remove(int_parameter);
删除给定位置的元素,并
list.remove(Integer_parameter);
从列表中删除给定的对象。
这是因为VM首先尝试查找使用完全相同的参数类型声明的方法,然后才尝试自动装箱。
发布于 2010-12-26 22:31:51
list.remove(4)
与list.remove(int index)
完全匹配,因此将调用它。如果您想调用list.remove(Object)
,请执行以下操作:list.remove((Integer)4)
。
https://stackoverflow.com/questions/4534146
复制相似问题