Java:采用这种方式删除List中的元素有何不妥?
2014-11-29 来自:月女之瞳 2 人回应

今天老大审查我的代码发现我有一段代码是这么写的,实现删除List中值为"girl"的项,老大说这样会有潜在隐患

import java.util.ArrayList;
import java.util.List;

public class Client {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("boy");
list.add("girl");
list.add("good");
list.add("girl");

for(int i=0;i<list.size();i++){
if(list.get(i).equals("girl")){
list.remove(i);
}
}
}
}

老大说直接在list中执行remove()会改变list.size()的大小,但是我觉得改变就改变了呗,也没什么影响吧?会有什么隐患呢?是不是说如果list.remove(i);后面还有其他代码用到这个i的时候这个i就已经不对了呢?


今天研究了下,结论如下:
【for循环】
使用for循环删除list元素的问题在于,这种删除方式可能会漏删个元素,因为删除元素后List元素的索引在发生变化,比如循环到i=1的元素时删除了该元素,接下来会去访问i=2的元素,实际上访问到的是原先的i=3的元素
【foreach】
使用foreach时能用在删除一个元素的情况下,且需要理解break,如果使用foreach删除多个元素会抛出ConcurrentModificationException异常
【Iterator】
应该使用这种方式

请参考:http://haohaoxuexi.iteye.com/blog/1523785

2014-12-01 来自:NO.

现在可以用java8里的filter

2014-11-29 来自:珊珊sss珊珊

应该是的。
你用foreach吧(Java好久没碰了,应该有foreach吧)。

您的回应

你还未登陆,不能回应!登陆