,我知道的是:
ConcurrentModificationException ),那么快速失败的迭代器将抛出一个iterator.remove()。我正在读一本书,在书中我发现了以下几句话:
HashMap提供了它的一组键,一个Java应用程序可以迭代它们。因此,HashMap是快速失败的.
我不明白的地方是上面写着“因此.”如果有人告诉我,HashMap提供了它的一组密钥,我仍然不知道它是故障快速的还是故障安全的(仅基于这一点)。
那么,为什么提供自己的一组密钥使 HashMap快速失败呢?
这两件事之间的联系是什么?
发布于 2016-02-18 09:35:47
它实际上是第一句,它提供了为什么HashMap是快速失败的信息:
HashMap提供了它的一组键,一个Java应用程序可以迭代它们。
失败安全的迭代器遍历原始集合的私有副本,而不是集合本身。因此,迭代器不会注意到对原始集合的任何更改,因此它不会抛出CME。
由于HashMap为提供了它的键集,如上面的引号(而不是其副本)所示,因此它是不会失败的。
发布于 2016-02-18 09:47:24
作者只是没有完成这个想法。
来自HashMap的javadocs (https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#keySet() )
“返回此映射中包含的键的集合视图。该集合由映射支持,因此对映射的更改将反映在映射集中,反之亦然。如果映射是在正在进行的迭代过程中被修改(除非通过迭代器自己的删除操作),则迭代的结果是未定义的。该集合支持元素删除,它通过Iterator.remove、Set.remove、removeAll、retainAll和clear操作从地图中删除相应的映射。它不支持添加或addAll操作。”
没有表达的想法是使用keySet提供的集合对散列映射进行迭代(好吧,让我们把它当作对映射的迭代.)。由于该集合是快速失败的(如上面的文档所示),映射也是故障快速的。
请记住,其他方法允许迭代映射(但幸运的是,据我所见,它们也是快速失败的)。检查https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#entrySet()
https://stackoverflow.com/questions/35477489
复制相似问题