首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:集合概述
第二章:Collection 接口
2.1 概述
2.2 常用方法
第三章:Iterator 迭代器
3.1 Iterator 接口
3.2 迭代器实现原理
3.3 使用 Iterator 迭代器删除元素
3.4 并发修改异常
3.5 集合存储自定义对象并迭代
3.6 增强 for 循环
3.7 java.lang.Iterable 接口
第四章:List 接口
4.1 概述
4.2 常用方法
4.3 List 特有的迭代器 ListIterator
4.4 List 接口的实现类:ArrayList
4.5 List 接口的实现类:LinkedList
第五章:Set 接口
5.1 概述
5.2 Set 的实现类:HashSet
5.3 Set 的实现类之三:TreeSet
第六章:Collections 工具类
6.1 概述
6.2 常用方法
6.3 Collections 的同步控制方法
第七章:Map 接口
7.1 概述
Map 接口常用的方法
7.2 Map 的实现类:HashMap
7.3 Map 的实现类:LinkedHashMap
7.4 Map 的实现类:Hashtable
7.5 Map 的实现类:TreeMap
7.6 Map 的实现类:Properties
当前位置:
首页>>
技术小册>>
Java语言基础10-Java中的集合
小册名称:Java语言基础10-Java中的集合
- 异常的产生原因:在迭代器遍历集合的过程中,调用集合自身的功能(例如:调用集合的 add 和 remove 方法),改变集合的长度。 - 示例:并发修改异常 ``` package com.github.collection1.demo4; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * @author maxiaoke.com * @version 1.0 */ public class Test { public static void main(String[] args) { Collection<String> collection = new ArrayList<>(); collection.add("aa"); collection.add("bb"); collection.add("cc"); collection.add("dd"); for (Iterator<String> iterator = collection.iterator(); iterator.hasNext();) { String ele = iterator.next(); System.out.println("ele = " + ele); collection.add("ee"); } } } ``` ![](/uploads/images/20230726/4fd7d67f13fe897078197476bbf13243.png) - 如果在 Iterator、ListIterator 迭代器创建后的任意时间从结构上修改了集合(通过迭代器自身的remove或add方法之外的任何其他方式),则迭代器会抛出 ConcurrentModificationException 异常。因此,面对并发的修改,迭代器很快会失败,而不是冒着在将来不确定的时间发生不确定行为的风险。 - 这样设计时因此,迭代器代表集合中的某个元素的位置,内部会存储某些能够代表该位置的信息。当集合发生改变的时候,该信息的含义可能会发生变化,这个时候操作迭代器就有可能造成不可预料的后果。因此,果断抛出异常阻止,是最好的方法,者就是 Iterator 迭代器的快速失败机制。 - 需要注意的是,迭代器的快速失败机制行文不能得到保证,一般来说,存在不同步的并发修改时,不可能做出任何坚决的保证。快速失败机制尽最大努力抛出 ConcurrentModificationException 。因此,迭代器的快速失败行文应该仅仅用于检测bug 。 - 快速失败机制的实现原理: ○ ① 在 ArrayList 等集合类中都有一个 modCount 变量,它用来记录集合的结构被修改的次数。 ○ ② 当我们给集合添加或删除元素的时候,会导致 modCount++ 。 ○ ③ 当我们使用 Iterator 迭代器遍历集合的时候,会使用一个变量记录当前集合的 modCount 。例如:int expectedModCount = modCount;,并且,在迭代器每次 next() 迭代元素的时候,都要检查 expectedModCount != modCount ,如果不相等,则说明调用了 Iterator 迭代器以外的 Collection 的 add 、remove 等方法,修改了集合的结构,使得 modCount++ ,值变了,就会抛出 ConcurrentModificationException 。
上一篇:
3.3 使用 Iterator 迭代器删除元素
下一篇:
3.5 集合存储自定义对象并迭代
该分类下的相关小册推荐:
Java语言基础5-面向对象初级
Java语言基础13-类的加载和反射
Java语言基础15-单元测试和日志技术
Java语言基础2-运算符
java源码学习笔记
SpringBoot零基础到实战
Java并发编程实战
Java语言基础4-数组详解
Java面试指南
Java性能调优实战
Mybatis合辑1-Mybatis基础入门
JAVA 函数式编程入门与实践