java小知识点(3)

迭代器是做什么的?迭代器的fail-fast机制了解吗?主要为了解决什么问题?

 

集合的for循环。快速失败机制。集合在迭代时,其他线程有修改操作,会抛并发修改异常。

 

从定义上看,迭代器是为容器而生,它本质上就是一种遍历的算法。因为容器的实现千差万别,很多时候不可能知道如何去遍历一个集合对象的元素。Java为我们提供了使用迭代的接口,Java的所有集合类丢失进行迭代的。

在迭代器Iteartor接口中,有以下3个方法:

1.hasNext() 该方法英语判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false

2.next() 把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用

3.remove()  从迭代器指向的Collection中移除迭代器返回的最后一个元素,该操作使用的比较少。

注意:从Java5.0开始,迭代器可以被foreach循环所替代,但是foreach循环的本质也是使用Iterator进行遍历的。

  1. public class Test3 {  
  2.   
  3.     public static void main(String[] args) {  
  4.         List<String>list=new ArrayList<>();  
  5.         list.add("a");  
  6.         list.add("b");  
  7.         Iterator<String>it=list.iterator();//得到lits的迭代器  
  8.         //调用迭代器的hasNext方法,判断是否有下一个元素  
  9.         while (it.hasNext()) {  
  10.             //将迭代器的下标移动一位,并得到当前位置的元素值  
  11.             System.out.println(it.next());    
  12.         }     
  13.     }  
  14. }  

fail-fast 机制是java集合(Collection)中的一种错误机制。

当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

接下来,我们再系统的梳理一下fail-fast是怎么产生的。步骤如下:
(01) 新建了一个ArrayList,名称为arrayList。
(02) 向arrayList中添加内容。
(03) 新建一个“线程a”,并在“线程a”中通过Iterator反复的读取arrayList的值
(04) 新建一个“线程b”,在“线程b”中删除arrayList中的一个“节点A”。
(05) 这时,就会产生有趣的事件了。
       在某一时刻,“线程a”创建了arrayList的Iterator。此时“节点A”仍然存在于arrayList中,创建arrayList时,expectedModCount = modCount(假设它们此时的值为N)。
       在“线程a”在遍历arrayList过程中的某一时刻,“线程b”执行了,并且“线程b”删除了arrayList中的“节点A”。“线程b”执行remove()进行删除操作时,在remove()中执行了“modCount++”,此时modCount变成了N+1
“线程a”接着遍历,当它执行到next()函数时,调用checkForComodification()比较“expectedModCount”和“modCount”的大小;而“expectedModCount=N”,“modCount=N+1”,这样,便抛出ConcurrentModificationException异常,产生fail-fast事件。

解决集合在迭代时,其他线程有修改操作,会抛并发修改异常。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值