失败快速迭代器
我得到了这个定义:正如名称所暗示的那样,一旦他们意识到自迭代开始以来已经改变了Collection的结构,它就会失败。
迭代开始以来意味着什么? 是Iterator之后的意思是it = set.iterator()这行代码?
public static void customize(BufferedReader br) throws IOException{ Set set=new HashSet(); // Actual type parameter added **Iterator it=set.iterator();**
首先,它们是快速失败的,而不是故障安全的 。
合同是某些类型的集合的结构修改(即插入/删除)使现有的迭代器无效。 失败快速迭代器尝试检测它们不应该是有效的并抛出ConcurrentModificationException
。 这是作为程序员的一项服务完成的,可以帮助您更快地发现此类错误。
在你的例子中:
Iterator it = set.iterator(); it.next(); set.add("unique-entry"); // invalidates the iterator it.next();
如果你很幸运,第二个it.next()
将检测无效用法并抛出exception。 请注意,这是在尽力而为的基础上完成的,并不能保证。
是Iterator之后的意思是it = set.iterator()这行代码?
是。 如果你查看HashSet.iterator()
的代码,你会看到它就是这样的:
return map.keySet().iterator();
…委托给HashMap.KeySet.iterator()
。 链中还有一些链接,但最终你会到达HashMap.HashIterator
,它在构造函数中包含这个:
private abstract class HashIterator implements Iterator { int expectedModCount; // For fast-fail ... HashIterator() { expectedModCount = modCount; ... } }
…其中modCount
是HashMap
的封闭实例中的一个字段,用于跟踪修改的数量。
迭代器快速失败意味着下面的代码会失败:
Set set = new HashSet (); Iterator it = set.iterator(); set.add(""); it.next(); // the set has changed now, and the iterator will throw an exception
因为发生以下一系列事件:创建迭代器,然后更改其底层集合,然后访问迭代器。
是的,在使用.iterator()之后不要更改集合如果你打算迭代它,你可以使用.remove()如果你想删除最新的元素
在失败之前快速Iterator开始工作它正在计算收集,并且在任何迭代之后它正在检查计数是否被更改,并且在更改计数的情况下,JVM将抛出ConcurrentModificationException。 Fail fast迭代器是java.util包中的任何集合迭代器(例如ArrayList,LinkedList等),Fail Safe迭代器是java.concurrent包内的迭代器(例如CopyOnWriteArrayList,CopyOnWriteSet等)。 失败快速迭代器将在并发修改的情况下抛出exception,但失败安全迭代器基本上使用集合副本,在并发修改的情况下不会抛出exception。