首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么HashMap不能失败,仅仅因为它提供了一种迭代其键的方法?

为什么HashMap不能失败,仅仅因为它提供了一种迭代其键的方法?
EN

Stack Overflow用户
提问于 2016-02-18 09:28:15
回答 2查看 922关注 0票数 3

,我知道的是:

  • 如果我试图在迭代时修改给定的元素,而不使用迭代器的方法(如ConcurrentModificationException ),那么快速失败的迭代器将抛出一个iterator.remove()
  • 不能保证快速失败的迭代器总是抛出CME。
  • 故障安全迭代器不会抛出CME。

我正在读一本书,在书中我发现了以下几句话:

HashMap提供了它的一组键,一个Java应用程序可以迭代它们。因此,HashMap是快速失败的.

我不明白的地方是上面写着“因此.”如果有人告诉我,HashMap提供了它的一组密钥,我仍然不知道它是故障快速的还是故障安全的(仅基于这一点)。

那么,为什么提供自己的一组密钥使 HashMap快速失败呢?

这两件事之间的联系是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-18 09:35:47

它实际上是第一句,它提供了为什么HashMap是快速失败的信息:

HashMap提供了它的一组键,一个Java应用程序可以迭代它们。

失败安全的迭代器遍历原始集合的私有副本,而不是集合本身。因此,迭代器不会注意到对原始集合的任何更改,因此它不会抛出CME

由于HashMap提供了它的键集,如上面的引号(而不是其副本)所示,因此它是不会失败的。

票数 3
EN

Stack Overflow用户

发布于 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()

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

https://stackoverflow.com/questions/35477489

复制
相关文章

相似问题

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