Java集合框架 源码分析 迭代器 并发修改异常 同步锁解决多线程修改集合问题

迭代器

Java中的Iterator(迭代器)是集合框架中用于遍历容器元素的统一接口,提供了一种标准化的元素访问方式,无需依赖具体集合类型的实现细节。以下是其核心要点:


一、核心方法与使用步骤

获取迭代器
通过集合的

  1. iterator()方法获取迭代器对象:
Iterator<String> it = list.iterator();

遍历元素
使用

  1. hasNext()判断是否存在下一个元素,next()获取当前元素并移动指针:
while (it.hasNext())  {
    String element = it.next(); 
    System.out.println(element); 
}

删除元素
通过

  1. remove()删除最后一次next()返回的元素(需先调用next()):
it.next(); 
it.remove();  // 安全删除当前元素

二、核心特性

解耦遍历逻辑
将遍历操作与集合实现分离,适用于所有

  1. Collection子类(如ArrayList、HashSet)。
  2. 单向遍历机制
    仅支持从前向后遍历,指针初始位置位于第一个元素之前。

快速失败机制(Fail-Fast)
若遍历过程中通过集合自身方法(非迭代器的

  1. remove())修改结构,会抛出ConcurrentModificationException异常。
  2. 一次性使用
    遍历结束后迭代器失效,需重新获取才能再次遍历。

三、与ListIterator的区别

特性

Iterator

ListIterator

遍历方向

单向(向前)

双向(向前/向后)

元素修改

仅支持删除

支持增删改(

add()

,

set()

索引定位

不支持

支持(

nextIndex()

,

previousIndex()

适用范围

所有Collection

仅List及其子类


四、应用场景与注意事项

  • 遍历时删除元素:优先使用迭代器的remove()而非集合自身的删除方法。
  • 性能优化:对于ArrayList等数组结构,迭代器遍历效率与普通for循环相当;对链表结构(如LinkedList)效率更高。
  • 增强for循环底层:Java的for-each循环本质是迭代器的语法糖。

五、示例代码

List<String> list = Arrays.asList("A",  "B", "C");
Iterator<String> it = list.iterator(); 
while (it.hasNext())  {
    String item = it.next(); 
    if ("B".equals(item)) {
        it.remove();  // 安全删除元素 
    }
}

通过迭代器,开发者可以以统一的方式处理不同类型的集合,同时避免直接操作集合内部结构带来的风险。如需更复杂的遍历(如双向操作),可改用

ListIterator

并发修改异常 源码 + 图解

首先是 集合初始化的时候

会给集合内部的一个成员变量 modCount 赋值

表示集合实际上被修改的次数


接着会有一个expectedModCount

当迭代器创建的时候 就会有这个出现这个变量

表示预期被修改的次数


迭代器 interator 的 next 方法中

调用一个 check 方法

每次都要判断一下 modCount 和 expectedCount 是不是相等


这样做是为了避免并发修改

并发修改异常 示例代码

import java.util.*;

public class Main {
    public static void main(String[] args) {

        // 并发修改异常
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> iterator = list.iterator();

        while (iterator.hasNext()){
            if(iterator.next()==1){
                list.remove(1);
            }
        }
        System.out.println(list);

    }
}

报错

解决并发修改异常 一种方法

import java.util.*;

public class Main {
    public static void main(String[] args) {

        // 并发修改异常
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> iterator = list.iterator();

        while (iterator.hasNext()){
            if(iterator.next()==1){
                iterator.remove();
            }
        }
        System.out.println(list);

    }
}

多线程并发修改问题

可以使用同步锁解决

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class JucHashMap {

    public static void main(String[] args) {
        // 多线程并发修改

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(5);

        Thread thread1=new Thread(()->{
//            synchronized (arrayList){
//                ListIterator<Integer> integerListIterator = arrayList.listIterator();
//                while (integerListIterator.hasNext()){
//                    System.out.println(integerListIterator.next());
//                    try {
//                        Thread.sleep(1000);
//                    } catch (InterruptedException e) {
//                        throw new RuntimeException(e);
//                    }
//                }
//            }
            ListIterator<Integer> integerListIterator = arrayList.listIterator();
            while (integerListIterator.hasNext()){
                System.out.println(integerListIterator.next());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        Thread thread2 = new Thread(() -> {
//            synchronized (arrayList){
//                ListIterator<Integer> integerListIterator = arrayList.listIterator();
//                while (integerListIterator.hasNext()){
//                    if(integerListIterator.next()==1){
//                        integerListIterator.remove();
//                    }
//                }
//            }
            ListIterator<Integer> integerListIterator = arrayList.listIterator();
            while (integerListIterator.hasNext()){
                if(integerListIterator.next()==1){
                    integerListIterator.remove();
                }
            }
        });

        thread1.start();
        thread2.start();


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是一只多多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值