For循环为什么不能对集合进行删除操作

For循环为什么不能对集合进行删除操作

原因

当我们对一个List进行遍历删除时我们会发现它会给我们报ConcurrentModificationException异常,那它背后是什么机制呢???

这是因为forEach里的Iterator迭代对象是工作在一个独立的线程中的,并且会拥有一个mutex的锁,所以Iterator在被创建之后呢,会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,也就是我们的这个集合发生变化的时候呢,这个索引表的内容。是不会同步去改变的;

所以,当索引指针往后移动的时候就找不到要迭代的对象了,这时,就按照fail- fast原则,使得Iterator,马上抛出java.util.ConcurrentModificationException异常;

因此Iterator在工作的时候呢,是不允许被迭代的对象,因为某种原因动态的去改变,也就是不支持调用集合的remove方法,在遍历的过程中动态地去移除元素;

但是呢,我们可以使用Iterator本身的remove方法来删除对象,因为Iterator的remove方法呢,会在删除当前迭代对象的同时去维护单链索引表的一致性,

因此,咱们可以考虑使用迭代器的方式来遍历集合的方式来对元素进行删除。

例如

Iterator<String> it = list.iterator();
  while(it.hasNext()){
      String a= it.next();
      if(a.length()==0){
          it.remove();
      }
  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值