失败快速迭代器

时间:2012-11-25 09:53:04

标签: java collections iterator fail-fast

我得到了这个定义:正如名称所暗示的那样,一旦他们意识到Collection的结构已经改变,因为迭代已经开始,因此失败快速迭代器会失败。

是什么意思,因为迭代已经开始?是 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 个答案:

答案 0 :(得分:9)

首先,它们是失败的 - 快速,而不是失败 - 安全

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

在你的例子中:

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

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

答案 1 :(得分: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

因为发生以下一系列事件:创建迭代器,然后更改其底层集合,然后访问迭代器。

答案 2 :(得分: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;
        ...
    }
}

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

答案 3 :(得分:0)

是的,如果您计划迭代它,请不要在使用.iterator()后更改集合,如果要删除最新元素,可以使用.remove()