fail-fast以及Iterator对象
Posted riverer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fail-fast以及Iterator对象相关的知识,希望对你有一定的参考价值。
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对象的主要内容,如果未能解决你的问题,请参考以下文章
fail-fast vs fail-safe iterator in Java
Java集合详解3:Iterator,fail-fast机制与比较器