老张
资深Java开发工程师
在Java开发中,List是最常用的集合类型之一,但它的remove方法却隐藏着一些容易让人踩坑的陷阱。今天我就来分享一下我在实际开发中遇到的List.remove()方法的问题,以及如何避免这些陷阱。
在开发过程中,我遇到了一个看似简单的需求:从一个List中删除所有等于特定值的元素。我最初写了这样的代码:
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(2);
numbers.add(4);
for (int i = 0; i < numbers.size(); i++) {
if (numbers.get(i) == 2) {
numbers.remove(i);
}
} 运行后发现结果并不符合预期:List中仍然保留了一个值为2的元素。
经过调试和分析,发现了两个主要问题:
当删除一个元素后,List中后面的元素会向前移动,导致索引发生变化。在上面的例子中:
但如果List是[2,2,2,2],就会发现只能删除一半的元素。
List接口有两个remove方法:
remove(int index):删除指定位置的元素remove(Object o):删除第一个匹配的元素当使用List<Integer>时,如果直接写remove(2),编译器会调用remove(int index)而不是remove(Object o)。
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
if (number == 2) {
iterator.remove();
}
} for (int i = numbers.size() - 1; i >= 0; i--) {
if (numbers.get(i) == 2) {
numbers.remove(i);
}
} numbers.removeIf(number -> number == 2); 对于不同的场景,各种方法的性能表现也不同:
在Java中使用List.remove()方法时需要注意以下几点:
这个小陷阱看似简单,但在实际开发中却经常导致难以发现的bug。希望这篇文章能帮助大家避免类似的错误。