2

我正在阅读 HashMap 的属性。并找到了一个关于 SO有很多选票的答案,上面写着:

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

虽然 JavaDoc 说

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

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

有人可以解释吗?

4

5 回答 5

1

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

于 2013-09-09T07:34:38.587 回答
1

我认为它只是快速失败。

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

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

很多票并不一定意味着 SO 答案是正确的。我还发现了该答案的其他几个问题。IMO,它不值得它收到的大量赞成票。

不幸的是,人们出于各种原因投票给答案,这可能导致各种异常情况。

于 2013-09-09T07:44:46.017 回答
1

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

快速失败:通过积极检查尽快失败。HashMap的迭代器是快速失败的,因为它一ConcurrentModificationException检测到底层结构的变化就会抛出 a 。

于 2013-09-09T07:38:29.437 回答
0

Well I was confused by this as well, but actually it is very simple:

Say we have:

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

Then for hm we can do hm.keySet().iterator() which returns an iterator and is fast-fail; while for ht, we can both do ht.keySet().iterator which returns an iterator and is fast-fail, and do ht.keys() which returns an enumeration object and is NOT fast-fail.

于 2015-02-12T22:30:35.497 回答
0

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

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

于 2013-09-09T12:31:44.317 回答