我正在阅读 HashMap 的属性。并找到了一个关于 SO有很多选票的答案,上面写着:
HashMap 中的迭代器是故障安全的,而 Hashtable 的枚举器则不是。
虽然 JavaDoc 说
所有此类的“集合视图方法”返回的迭代器都是快速失败的:
实际上,回答的票数让我感到困惑。否则我认为它只是快速失败。
有人可以解释吗?
我正在阅读 HashMap 的属性。并找到了一个关于 SO有很多选票的答案,上面写着:
HashMap 中的迭代器是故障安全的,而 Hashtable 的枚举器则不是。
虽然 JavaDoc 说
所有此类的“集合视图方法”返回的迭代器都是快速失败的:
实际上,回答的票数让我感到困惑。否则我认为它只是快速失败。
有人可以解释吗?
HashMap 的迭代器是快速失败的如果您在迭代它时尝试修改它会抛出 ConcurrentModificationException,而“java.util.concurrent”包下的集合具有故障安全迭代器。您可以在迭代集合时修改集合。主要用于多线程环境
我认为它只是快速失败。
你是对的。编写该答案的人可能不了解快速故障和故障安全之间的区别。
实际上,回答的票数让我感到困惑。
很多票并不一定意味着 SO 答案是正确的。我还发现了该答案的其他几个问题。IMO,它不值得它收到的大量赞成票。
不幸的是,人们出于各种原因投票给答案,这可能导致各种异常情况。
是的,你的理解是正确的。
快速失败:通过积极检查尽快失败。HashMap
的迭代器是快速失败的,因为它一ConcurrentModificationException
检测到底层结构的变化就会抛出 a 。
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.
许多读者对他们期望阅读的内容做出反应,并忽略了细微的差异。您链接的答案实际上解释了快速失败的含义,因此只有一个词不匹配:“失败安全”与“快速失败”。
另一点是,很多人接受听起来似乎合理的答案。我想,没有人真正测试过Hashtable
' 枚举器的行为是否真的与HashMap
' 迭代器不同。从我刚刚检查的版本 1.6.0_35 开始,两者都尝试快速失败。