【Java面试题】List如何一边遍历,一边删除?
java开发手册:不要在foreach循环里进行元素的remove/add操作。remove元素请使用terator方法,如果并发操作,需要对iterator对象加锁。
可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的:
List<String> list=new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(String i:list) {
if(i.equals("1")) {
list.remove(i);
}
}
System.out.println(list);
异常

让我们看一下下面的字节码

由此可以看出,foreach循环在实际执行时,其实使用的是Iterator,使用的核心方法是hasnext()和next()。
下面写出3种正确写法
使用iterator的remove
List<String> list =new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
Iterator iter=list.iterator();
while(iter.hasNext()) {
String all=(String) iter.next();
if(all.equals("1")) {
iter.remove();
}
}
System.out.println(list);
for正循环遍历
这种实现方式比较好理解,就是通过数组的下标来删除,不过有个注意事项就是删除元素后,要修正下下标的值
List<String> list =new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(int i=0;i<list.size();i++) {
String iter=list.get(i);
if(iter.equals("1")) {
list.remove(i);
i=i-1;
}
}
System.out.println(list);
for倒序遍历
List<String> list =new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(int i=list.size()-1;i>=0;i--) {
String iter=list.get(i);
if(iter.equals("1")) {
list.remove(i);
}
}
System.out.println(list);
花名龙欺,支持一波
浙公网安备 33010602011771号