List循环中正确删除元素
List在循环时我们需要根据条件删除该List中满足条件的元素,最先想到的是按照下面的方式:
public class Demo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
list.add("fff");
System.out.println("Before :" + list);
for (String element : list) {
if (element.equals("ccc")) {
list.remove(element);
}
}
System.out.println("After :" + list);
}
}
看起来没什么问题,但是却报如下的错误:
为什么会这样?
首先Java的for循环,就是将List对象遍历托管给Iterator,你如果要对list进行增删操作,都必须经过Iterator。
其实,Iterator可以理解为一个索引,他依靠在其所要迭代的集合上,一旦使用lhm.remove,就会使原来的集合结构遭到破坏,此时原来的集合与iterator的索引结构不一致,自然iterator就会报错。而用iteraotr.remove(),iterator会自动的维护被迭代集合的索引一致性,因此能够正常运行。
修改成如下就可以正常删除:
public class Demo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
list.add("fff");
System.out.println("Before :" + list);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String element = iterator.next();
if (element.equals("ccc")) {
iterator.remove();
}
}
System.out.println("After :" + list);
}
}
结果:
Before :[aaa, bbb, ccc, ddd, eee, fff]
After :[aaa, bbb, ddd, eee, fff]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!