- 2024-09-23JavaSE---Fail-Fast
总结主要用于集合类中,以确保在遍历集合时如果集合本身被修改,则会立即抛出ConcurrentModificationException异常。原理内部计数器:每个集合对象都有一个内部计数器,称为modCount(modificationcount)。每当集合结构被修改(比如添加或删除元素),这个计数器就会增加。迭代器检查:当
- 2024-08-15【ArrayList】JDK1.8源码详细注释 以及如何实现线程安全的链表
ArrayList(JDK8)ArrayList有四个内部类,成员内部类Itr,成员内部类ListItr,静态内部类SubList,ArrayListSpliterator(暂时用不到)Itr是Iterator的实现类,支持正向遍历,ArrayList的iterator方法返回一个Itr对象ListItr是ListIterator的实现类,支持双向遍历,ArrayList的listIterator方法
- 2024-07-13for-each循环陷阱
for-each删除元素报错publicstaticvoidmain(String[]args){List<String>list=newArrayList<>();list.add("haha");list.add("xixi");list.add("hehe");for(Strings:list){if("h
- 2024-06-19ArrayList并发修改异常
遇到这么个问题:迭代器并发修改会抛出异常,这个问题之前没有遇到过,特意记录一下: publicstaticvoidmain(String[]args){//创建集合对象List<String>list=newArrayList<String>();//添加元素list.add("hello");list.add("Java
- 2023-12-28基于源码去理解Iterator迭代器的Fail-Fast与Fail-Safe机制
原创/朱季谦在Java编程当中,Iterator迭代器是一种用于遍历如List、Set、Map等集合的工具。这类集合部分存在线程安全的问题,例如ArrayList,若在多线程环境下,迭代遍历过程中存在其他线程对这类集合进行修改的话,就可能导致不一致或者修改异常问题,因此,针对这种情况,迭代器提供了两种处
- 2023-10-3008迭代器源码分析
Iterator一、源码分析size:集合的长度。cursor:光标,表示迭代器的指针,默认指向0索引位置二、modCount作用modCount++;是集合变化的次数(删除或者添加)。expectedModCount创建的迭代器的时候会把集合变化的次数传递给这个变量。(相当于迭代器对次数自己做了一次记录)c
- 2023-10-24ConcurrentModificationException异常,for循环遍历时候, add或者remove减少集合的元素时,抛出次错误
ConcurrentModificationException异常一:ConcurrentModificationException异常:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。二:遍历list集合时删除元素出现的异常publicstaticvoidmain(String[]args){ArrayList<String>list=newArrayList<String>();
- 2023-07-14HashMap里面有哪些方法会更改modCount
modCount是 HashMap 类中的一个成员变量,用于记录 HashMap 结构发生变更(如插入、删除、扩容等操作)的次数。在 HashMap 中,有以下方法会更改modCount的值:1.put(K key, V value):插入一个新的键值对。2.putAll(Map<? extends K, ? extends V> m):将一个 Map 中的所
- 2023-07-01深度理解Iterator底层源码
publicabstractclassAbstractList<E>extendsAbstractCollection<E>implementsList<E>{//外部操作数:记录添加数据、删除数据的次数(记录元素个数变化的次数) protectedtransientintmodCount=0;//4}这段代码是一个抽象类AbstractList,实现了List接口。下面是对代码
- 2023-06-06不能在foreach 循环中添加或删除元素
迭代器在遍历map的时候,会先拿到modCount存起来然后遍历,在遍历的时候会判断当前modCount的值与我第一次进来存的值是否一样,不一样就报错如果在循环中添加或删除元素,是直接调用集合的add,remove方法【导致了modCount增加或减少】,但这些方法不会修改迭代实例中的expectedModCount,导
- 2023-05-10集合的并发修改异常
情景一:ArrayList<Integer>arrayList=newArrayList<>();for(inti=0;i<10_000;i++){ arrayList.add(newRandom().nextInt(100_000_000));}/**开启多个线程,每个线程都执行迭代器*/for(inti=0;i<20;i++){ newThread(()->{ Iterator<
- 2023-04-23ArrayList的遍历方式与fail-fast
遍历方式普通for循环遍历for(inti=0;i<arrayList.size();i++){System.out.println(arrayList.get(i));}推荐使用普通for循环,效率最高。Iterator迭代Iterator<Integer>iterator=arrayList.iterator();while(iterator.hasNext()){System.out.println(itera
- 2023-02-13从List 删除元素开始说起
前言写错过List删除元素的方法,看到过正确方法,老是记错,还是写篇文章记录一下,mark. 先看一段代码:classTestArrayListIterator{publicstaticvoidmain(String[
- 2022-12-15如何解决ConcurrentModificationException的异常!
一.前言在使用使用ArrayList的subList的时候,发生了ConcurrentModificationException的异常。接下来看看如何处理二.异常场景2.1 代码如下下面是产生异常的代码。pu
- 2022-09-26迭代器遍历对象 快速失败和安全失败
一、快速失败(fail—fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出ConcurrentModificationException。原理:迭