码迷,mamicode.com
首页 > 其他好文 > 详细

fail-fast以及Iterator对象

时间:2020-06-25 15:41:03      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:不包含   exce   for   长度   test   包含   int   是你   static   

Iterator对象在foreach循环的时候只能使用自己的remove/add方法,如果使用了集合的remove/add方法或者其他线程并发时修改了集合的内容,就属于fail-fast机制,即是一个错误,但是该错误会尽最大可能地抛出ConcurrentModificationException异常,该异常应尽量作为一个bug的检测。

public class Test1 {
public static void main(String[] args) {
List<String> ls=new ArrayList<String>();
ls.add("Bob");
ls.add("Jia");
for(Iterator it=ls.iterator();it.hasNext();) {//这里的Iterator对象是一个List对象的另一种形式,头指针不包含元素,只包含头指针。每次的next方法都会输出下一个元素。
if ("Bob".equals(it.next())) {//这里会得到"Bob"。
ls.remove(0);//这里使用ls来移除或添加,那么操作过后总长度是变了的,会和Iterator对象长度不符,因此调用Iterator对象的next等方法会抛出Concurrent...异常。
System.out.println(it.next());//所以这里会抛出异常,不管是ls移除任意位置索引。除非Iterator调用自身方法移除队头元素即用it来移除就是remove()方法无参数,表示移除。

//但是如果把上述调用it.next()给注释掉,就不会抛出异常。当没有用hasNext来检验时,调用next()方法可能该元素不存在,会抛出NoSuchElementException异常。

//如果是并发操作,记得给Iterator对象上锁哦。

//通俗一点理解就是iterator方法就是说我要遍历ls的那几个元素我都做上记号,如果ls把他们删除或添加了,我这个Iterator遍历的范围同样随之改变(就是说我的next方法会动态改变),但是增加元素我这里是没有记号的,删除元素我这里有记号但是你没有元素也对不上,记号就对不上了自然会抛出异常。而Iterator对象本身的移除方法则是说我不遍历你了,就没有记号对不上一说。

}
}
}

fail-fast以及Iterator对象

标签:不包含   exce   for   长度   test   包含   int   是你   static   

原文地址:https://www.cnblogs.com/riverer/p/qqq321.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!