HashMap的迭代器是否安全?

时间:2013-09-09 07:31:42

标签: java collections hashmap

我正在阅读HashMap的一个属性。并且发现an answer on SO有很多选票说:

  

HashMap中的迭代器是故障安全的,而Hashtable的枚举器则不是。

虽然JavaDoc说

  

此类的所有“集合视图方法”返回的迭代器都是快速失败的:

实际上,回答的票数让我很困惑。否则我认为它只是快速失败。

有人可以解释一下吗?

5 个答案:

答案 0 :(得分:1)

HashMap的迭代器是失败快的如果你试图在迭代时修改它会抛出一个ConcurrentModificationException, 而在“java.util.concurrent”包下的集合具有故障安全迭代器。您可以在迭代时修改集合。主要用于多线程环境

答案 1 :(得分:1)

是的,您的理解是正确的。

快速失败:积极进行检查, asap 失败。 HashMap的迭代器是快速失败的,因为它会在检测到基础结构发生变化时立即抛出ConcurrentModificationException

答案 2 :(得分:1)

  

我认为它只是快速失败。

你是对的。写下该答案的人可能不了解故障快速和故障安全之间的区别。

  

实际上,回答的票数让我很困惑。

很多投票并不一定意味着SO答案是正确的。我也发现了该答案的几个其他问题。国际海事组织,它不应该得到它收到的大量赞成票。

不幸的是,人们因为各种原因投票给Answers,这可能导致各种异常现象。

答案 3 :(得分:0)

许多读者对他们期望阅读的内容作出反应,并忽略了小的差异。您链接的答案实际上解释了故障快速的含义,因此它只有一个单词与那里不匹配:“故障安全”与“快速故障”。

另一点是,很多人接受听起来似乎合理的答案。我想,没有人真正测试Hashtable的枚举器是否真的与HashMap的迭代器不同。从版本1.6.0_35开始,两者都试图快速失败。我刚检查过。

答案 4 :(得分:0)

我也对此感到困惑,但实际上它非常简单:

说我们有:

Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
HashMap<String, Integer> hm = new HashMap<String, Integer>();

然后对于hm,我们可以执行hm.keySet()。iterator(),它返回一个迭代器并且是​​快速失败的; 而对于ht,我们都可以执行ht.keySet()。iterator,它返回一个迭代器并且是​​快速失败的,并且执行ht.keys()返回一个枚举对象并且不是快速失败。