4

我得到了这个定义:顾名思义,快速失败的迭代器一旦意识到自迭代开始以来集合的结构已经改变,就会失败。

自迭代开始以来是什么意思?是不是意味着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();**
4

5 回答 5

9

首先,它们是快速故障的,而不是故障安全的。

契约是某些类型的集合的结构修改(即插入/删除)使集合中的现有迭代器无效。快速失败的迭代器尝试检测它们不应该是有效的并抛出一个ConcurrentModificationException. 这是为您(程序员)提供的一项服务,以帮助您更快地发现此类错误。

在您的示例中:

Iterator it = set.iterator();
it.next();
set.add("unique-entry"); // invalidates the iterator
it.next();

如果幸运的话,第二个it.next()会检测到无效使用并抛出异常。请注意,这是在尽力而为的基础上完成的,不能保证。

于 2012-11-25T09:57:32.433 回答
2

快速失败的迭代器意味着以下代码预计会失败:

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-25T09:57:59.957 回答
2

是不是意味着 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;
        ...
    }
}

... wheremodCount是封闭实例中的一个字段,HashMap它跟踪修改的数量。

于 2012-11-25T10:00:26.400 回答
0

是的,如果您打算对其进行迭代,请不要在使用 .iterator() 后更改集合,如果您想删除最新的元素,可以使用 .remove()

于 2012-11-25T09:58:54.440 回答
0

在 Fail Fast Iterator 开始工作之前,它会获取集合计数,并且在任何迭代之后,它会检查计数是否更改,如果计数更改,JVM 将抛出 ConcurrentModificationException。快速失败迭代器是 java.util 包内的任何集合迭代器(例如 ArrayList、LinkedList 等),而故障安全迭代器是 java.concurrent 包内的迭代器(例如 CopyOnWriteArrayList、CopyOnWriteSet 等)。Fail Fast迭代器在并发修改的情况下会抛出异常,但Fail Safe迭代器基本上是在处理集合的副本,在并发修改的情况下不会抛出异常。

于 2018-05-10T22:20:14.853 回答