我正在阅读HashMap的一个属性。并且发现an answer on SO有很多选票说:
HashMap中的迭代器是故障安全的,而Hashtable的枚举器则不是。
虽然JavaDoc说
此类的所有“集合视图方法”返回的迭代器都是快速失败的:
实际上,回答的票数让我很困惑。否则我认为它只是快速失败。
有人可以解释一下吗?
答案 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()返回一个枚举对象并且不是快速失败。