集合遍历时注意事项(面试题)

  1. 增强for循环
  2. Iterator迭代器
    他们在便利集合时,如果对集合元素进行(增/删),会报错:
ConcurrentModificationException

但是迭代器自身可以进行remove:

List<String> list = new ArrayList<>();
        int i = 0;
        while (i<20){
            list.add(String.valueOf(i));
            i++;
        }
 Iterator<String> iterable  = list.iterator();
        while(iterable.hasNext()){
            String s = iterable.next();
            if (s.equals("1")){
                iterable.remove();//可以
              //  list.remove(s);//报错
            }
        }

因为在你迭代之前,迭代器已经被通过list.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变其容器大小的操作,那么Java就会给出异常。因为此时Iterator对象已经无法主动同步list做出的改变,Java会认为你做出这样的操作是线程不安全的,就会给出善意的提醒(抛出ConcurrentModificationException异常)

  1. 但是在普通for循环中是可以进行的:
for(int j = 0; j<list.size();j++){
            list.remove("2");
        }

ArrayList中的快速失败机制(fail-fast)

快速失败机制产生的条件:当多个线程对Collection进行操作时,若其中某一个线程通过Iterator遍历集合时,该集合的内容被其他线程所改变,则会抛出ConcurrentModificationException异常。

使用Foreach时对集合的结构进行修改会出现异常:
实现了Iterable接口的类就可以通过Foreach遍历,那是因为foreach要依赖于Iterable接口返回的Iterator对象,所以从本质上来讲,Foreach其实就是在使用迭代器,在使用foreach遍历时对集合的结构进行修改,和在使用Iterator遍历时对集合结构进行修改本质上是一样的。所以同样的也会抛出异常,执行快速失败机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值