面试题:List集合的并发修改异常

本文探讨了Java中List的不同遍历方式(for, 增强for, iterator, listIterator)在添加、删除元素时的并发修改异常,并提供了优化建议。特别关注了增强for循环的并发问题及其解决方案。
摘要由CSDN通过智能技术生成
  List<Integer> list=new ArrayList();
        list.add(10);
        list.add(5);
        list.add(5);
        list.add(6);
        list.add(1);

使用for循环添加:

 System.out.println("操作前"+list);
        for (int i=0;i<list.size();i++){
            if (list.get(i)==10){
                list.add(9);
            }
        }
        System.out.println("操作后"+list);

输出:

操作前[10, 5, 5, 6, 1]
操作后[10, 5, 5, 6, 1, 9]

使用增强for循环添加:

   System.out.println("操作前"+list);
        for (int a :list){
           if (a==10){
               list.add(9);
           }
        }
        System.out.println("操作后"+list);

输出:

并发修改异常

使用iterator增加:

  System.out.println("操作前"+list);
        Iterator<Integer> itt = list.iterator();
       while(itt.hasNext()){
           if (itt.next()==10){
               list.add(10);
           }
       }
        System.out.println("操作后"+list);

输出:

并发修改异常

使用listIterator增加:

  System.out.println("操作前"+list);
        ListIterator<Integer> it= list.listIterator();
        while(it.hasNext()){
            if (it.next()==10){
                it.add(10);
            }
        }
        System.out.println("操作后"+list);

输出:

操作前[10, 5, 5, 6, 1]
操作后[10, 10, 5, 5, 6, 1]

使用普通for循环删除:

  System.out.println("操作前"+list);
        for (int i=0;i<list.size();i++){
            if (list.get(i)==5){
                list.remove(i);
            }
        }
        System.out.println("操作后"+list);

输出:

操作前[10, 5, 5, 6, 1]
操作后[10, 5, 6, 1]

使用增强for循环删除:

 List<String> list2 = new ArrayList<>(4);
        list2.add("a");
        list2.add("ab");
        list2.add("abc");
        list2.add("abcd");
        System.out.println("操作前"+list2);
        for (String a :list2){
            if (a.equals("a")){
                list2.remove(a);
            }
        }
        System.out.println("操作后"+list2);

输出:并发修改异常

使用iterator删除:


       System.out.println("操作前"+list);
        Iterator<Integer> it= list.iterator();
        while(it.hasNext()){
            if (it.next()==5){
                it.remove();
            }
        }
        System.out.println("操作后"+list);

输出:

操作前[10, 5, 5, 6, 1]
操作后[10, 6, 1]

解决问题:

    循环删除的时候,使用增强for循环会发生修改异常。使用普通for循环不会发生并发修改异常,但是会导致删除不完全,这是因为在删除的时候,会把后面的数据往前移动,可以使用倒序遍历解决这个问题。当然,在使用iterator也不会发生问题(最好)。

    为什么使用iterator增加会报错,因为iterator没有add方法,必须用list.add。而listIterator有add方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值