我得到了这个定义:正如名称所暗示的那样,一旦他们意识到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();**
答案 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;
...
}
}
...其中modCount
是HashMap
的封闭实例中的一个字段,用于跟踪修改次数。
答案 3 :(得分:0)
是的,如果您计划迭代它,请不要在使用.iterator()后更改集合,如果要删除最新元素,可以使用.remove()