热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于集合中元素的删除

先看段代码publicstaticvoidmain(String[]args){CollectioncollectionnewArrayList();collection.add

先看段代码

public static void main(String[] args) {Collection collection = new ArrayList();collection.add(1);collection.add(2);collection.add(3);Iterator iterator = collection.iterator();while(iterator.hasNext()){Object next = iterator.next();System.out.println(next);}}

这样遍历集合是没有问题的。
但是如果像这样

public static void main(String[] args) {Collection collection = new ArrayList();//没添加元素之前就获取迭代器 或者说获取迭代器之后集合又发生了改变Iterator iterator = collection.iterator();collection.add(1);collection.add(2);collection.add(3);while(iterator.hasNext()){Object next = iterator.next();System.out.println(next);}}

会报ConcurrentModification异常。
在这里插入图片描述
通俗点:迭代器就类似于一个快照,获取之后就不能改变了。如果改变,在通过迭代器获取元素的时候,就会报ConcurrentModificationException.

所以,在迭代集合元素的过程中,不能调用remove方法,删除元素。

public static void main(String[] args) {Collection collection = new ArrayList();Iterator iterator = collection.iterator();collection.add(1);collection.add(2);collection.add(3);while(iterator.hasNext()){Object next = iterator.next();//集合发生改变了 在调用迭代器的next方法 会报异常collection.remove(next);System.out.println(next);}}

所以报
在这里插入图片描述

那么我们应该如何删除集合中的元素呢?
我们可以应迭代器删除。

public static void main(String[] args) {Collection collection = new ArrayList();Iterator iterator = collection.iterator();collection.add(1);collection.add(2);collection.add(3);while(iterator.hasNext()){Object next = iterator.next();//使用迭代器删除 把快照中的元素删除后,迭代器对应的集合中的元素也就删除//这样就保持了快照和集合中元素一致iterator.remove();System.out.println(next);}}

成功删除,不会报错。
结论:
两种删除集合中的元素的方式:

1.Collection.remove(Object o) 集合中的remove方法
2.Iterrator.remove()迭代器中的remove方法.

结论:
a.使用集合删除元素时,迭代器获取的快照,发现原集合状态发生改变,快照还是原集合的快照。导致了状态不一致,会报ConcurrentModificationException。
如果坚持使用集合删除元素,需要更新迭代器。也就是要重新获取迭代器。
b.使用迭代器删除元素时,会自动更新迭代器,同时更新集合(同时删除集合中的元素)
删除元素时,建议使用迭代器删除。


推荐阅读
author-avatar
金和裤城_996
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有