我得到了这样的定义:顾名思义,快速失败迭代器一旦意识到集合的结构发生了变化,就会失败,因为自迭代开始以来,就开始了。
自迭代开始以来,意味着什么??这是否意味着在Iterator it=set.iterator()之后,这一行代码?
public static void customize(BufferedReader br) throws IOException{
Set<String> set=new HashSet<String>(); // Actual type parameter added
**Iterator it=set.iterator();**发布于 2012-11-25 09:57:32
首先,他们是失败-fast,而不是Fail-安全。
合同是某些类型集合的结构修改(即插入/删除)使现有迭代器无效。快速失败的迭代器试图检测它们不应该是有效的,并抛出一个ConcurrentModificationException。这是作为对您的服务,程序员,以帮助发现这种类型的错误更快。
在你的例子中:
Iterator it = set.iterator();
it.next();
set.add("unique-entry"); // invalidates the iterator
it.next();如果幸运的话,第二个it.next()将检测无效的用法并抛出一个异常。注意,这是在尽最大努力的基础上完成的,而且没有得到保证。
发布于 2012-11-25 09:57:59
迭代器是快速失败的,这意味着下面的代码将失败:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
set.add("");
it.next(); // the set has changed now, and the iterator will throw an exception因为发生了以下一系列事件:创建迭代器,然后它的底层集合发生更改,然后访问迭代器。
发布于 2012-11-25 10:00:26
这是否意味着在Iterator it=set.iterator()这一行代码之后?
是。如果您查看HashSet.iterator()的代码,就会发现它只是如下所示:
return map.keySet().iterator();..。哪个委托给HashMap.KeySet.iterator()。链中还有几个链接,但最终您将到达HashMap.HashIterator,它在构造函数中包含如下内容:
private abstract class HashIterator<E> implements Iterator<E> {
int expectedModCount; // For fast-fail
...
HashIterator() {
expectedModCount = modCount;
...
}
}..。其中modCount是HashMap的封闭实例中的一个字段,它跟踪修改的数量。
https://stackoverflow.com/questions/13549927
复制相似问题