失败快速迭代器

我得到了这个定义:正如名称所暗示的那样,一旦他们意识到自迭代开始以来已经改变了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; ... } } 

…其中modCountHashMap的封闭实例中的一个字段,用于跟踪修改的数量。

迭代器快速失败意味着下面的代码会失败:

 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。