关于迭代器在集合遍历中发生的并发修改异常

原因:迭代器是依赖于集合的,相当于集合的一个副本.
当迭代器操作的时候,如果发现和集合不一样,则抛出异常(并发修改异常)


Exception in thread “main” java.util.ConcurrentModificationException:并发修改异常

解决方案:
    方式1: 不使用迭代器
    方式2: 迭代器自身去修改,同步到集合
            List c = new ArrayList(); //创建对象的方式改变
            ListIterator lit = c.listIterator(); //得到的迭代器改变
            lit.add(“android”); //迭代器去添加

    方式三:(原始做法)用集合的size(),get(index)方法再用for循环去遍历操作内容

//报错代码(ConcurrentModificationException)代码如下


   
   
  1. public class Test01{
  2. public static void main(String[] args) {
  3. // 创建集合对象
  4. Collection c = new ArrayList();
  5. // 添加元素
  6. c.add( “hello”);
  7. c.add( “world”);
  8. c.add( “java”);
  9. // 我们可以通过遍历来获取集合中的每一个元素,然后进行比较即可
  10. Iterator it = c.iterator();
  11. while (it.hasNext()) {
  12. String s = (String) it.next();
  13. if (s.equals( “java”)) {
  14. c.add( “android”);
  15. }
  16. }
  17. System.out.println(c);
  18. }
  19. }
//解决方案方式2 代码如下:


   
   
  1. public class Test02{
  2. public static void main(String[] args) {
  3. // 创建集合对象
  4. List c = new ArrayList();
  5. // 添加元素
  6. c.add( "hello");
  7. c.add( "world");
  8. c.add( "java");
  9. ListIterator lit = c.listIterator();
  10. while(lit.hasNext()) {
  11. String s = (String)lit.next();
  12. if(s.equals( "java")) {
  13. lit.add( "android"); //直接用迭代器进行操作修改
  14. }
  15. }
  16. System.out.println(c);
  17. }
  18. }
注:使用增强for循环同样可能会出现这样的异常,因为其底层同样也是使用了迭代器。

关于for循环和迭代器的比较:

记录的存取方式有两种:一种是顺序存储,另一种是链接存储
对于顺序存储的记录可以根据其下标找到对应的记录,而链接存储(拿单链表为例)
则必须找到其前一个记录的位置才能够找到本记录。

所以for循环便于访问顺序存储的记录,比如数组等
而迭代则更适用于链接存储的记录,虽然Java中有些底层通过链接存储原理实现的集合
也可以通过下标获取指定的记录,但是其每次都必须从链表头开始查找记录,这样会影响查找的效率。

原文链接:https://blog.csdn.net/weixin_39494923/article/details/76599767

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值