如何在遍历容器的同时移除其中的元素呢?

List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
for (int i = 0; i < list.size(); i++) {
    list.remove(i);
    System.out.println(list);
}
[2, 3, 4, 5]
[2, 4, 5]
[2, 4]

上述代码存在的问题:当移除索引为 i 的元素后,原索引为 i+1 的元素的索引变为 i ,接下来遍历索引为 i+1 的元素时,原索引为 i+1 的元素被跳过。


那么要如何在遍历容器的同时移除其中的元素呢?

答案是使用容器的迭代器,迭代器有一个remove方法可以满足我们的需求。

List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
    iter.next();
    iter.remove();
    System.out.println(list);
}
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]

需要注意的是在使用迭代器遍历容器时,不能使用容器自身新的迭代器的方法进行添加删除,否则会抛出 ConcurrentModificationException。如下:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
for (Integer item : list) {
    list.remove(1); // 或则 list.add
    System.out.println(list);
}
[1, 3, 4, 5]
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at test.Test.main(Test.java:50)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    joshul阅读 2,885评论 0 2
  • 1.Java集合框架是什么?说出一些集合框架的优点?每种编程语言中都有集合,最初的Java版本包含几种集合类:Ve...
    yjaal阅读 4,881评论 1 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,949评论 19 139
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 5,427评论 0 3
  • 伊颜晞小主随笔:女人理想的模样 一个女人不仅赢得男人的喜欢,更加重要的是赢得女人的喜欢。 只要她出现的地方,必然是...
    伊颜晞阅读 1,594评论 0 0

友情链接更多精彩内容