热门标签 | 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.使用迭代器删除元素时,会自动更新迭代器,同时更新集合(同时删除集合中的元素)
删除元素时,建议使用迭代器删除。


推荐阅读
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • 本文将探讨Java编程语言中对象和类的核心概念,帮助读者更好地理解和应用面向对象编程的思想。通过实际例子和代码演示,我们将揭示如何在Java中定义、创建和使用对象。 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 本文详细介绍了如何在 Objective-C 中使用 @public 和 @protected 修饰符来控制类成员的访问权限。同时,探讨了点语法和箭头操作符的区别,以及属性声明和实现的自动生成。 ... [详细]
  • 本文详细解析了Java中hashCode()和equals()方法的实现原理及其在哈希表结构中的应用,探讨了两者之间的关系及其实现时需要注意的问题。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本题要求实现一个函数,用于检查给定的字符串是否为回文。回文是指正向和反向读取都相同的字符串。例如,“XYZYX”和“xyzzyx”都是回文。 ... [详细]
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社区 版权所有