首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >故障快速迭代器

故障快速迭代器
EN

Stack Overflow用户
提问于 2012-11-25 09:53:04
回答 5查看 4.2K关注 0票数 4

我得到了这样的定义:顾名思义,快速失败迭代器一旦意识到集合的结构发生了变化,就会失败,因为自迭代开始以来,就开始了

自迭代开始以来,意味着什么??这是否意味着在Iterator it=set.iterator()之后,这一行代码?

代码语言:javascript
复制
public static void customize(BufferedReader br) throws IOException{  
    Set<String> set=new HashSet<String>(); // Actual type parameter added  
    **Iterator it=set.iterator();**
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-25 09:57:32

首先,他们是失败-fast,而不是Fail-安全

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

在你的例子中:

代码语言:javascript
复制
Iterator it = set.iterator();
it.next();
set.add("unique-entry"); // invalidates the iterator
it.next();

如果幸运的话,第二个it.next()将检测无效的用法并抛出一个异常。注意,这是在尽最大努力的基础上完成的,而且没有得到保证。

票数 9
EN

Stack Overflow用户

发布于 2012-11-25 09:57:59

迭代器是快速失败的,这意味着下面的代码将失败:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-11-25 10:00:26

这是否意味着在Iterator it=set.iterator()这一行代码之后?

是。如果您查看HashSet.iterator()的代码,就会发现它只是如下所示:

代码语言:javascript
复制
return map.keySet().iterator();

..。哪个委托给HashMap.KeySet.iterator()。链中还有几个链接,但最终您将到达HashMap.HashIterator,它在构造函数中包含如下内容:

代码语言:javascript
复制
private abstract class HashIterator<E> implements Iterator<E> {
    int expectedModCount;   // For fast-fail

    ...

    HashIterator() {
        expectedModCount = modCount;
        ...
    }
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13549927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档