HashMap的迭代器是什么意思是快速失败并且HashTable的枚举器不是?

我正在查找这两个类之间的区别,这一点在很多答案中得出了这个博客的来源: http : //javarevisited.blogspot.com/2010/10/difference-between-hashmap-and。 HTML

但是我没有完全理解它。 有人可以详细说明吗? 或许有一个例子?

感谢您的关注!

快速失败意味着当您在迭代时尝试修改内容时,它将失败并抛出ConcurrentModificationException。

Set keys = hashMap.keySet(); for (Object key : keys) { hashMap.put(someObject, someValue); //it will throw the ConcurrentModificationException here } 

对于HashTable枚举:

  Enumeration keys = hashTable.keys(); while (keys.hasMoreElements()) { hashTable.put(someKey, someValue); //this is ok } 

调用iterator.next() ,如果在创建迭代器和调用next()之间进行了任何修改,则会立即抛出ConcurrentModificationException。 这就是失败快速的意思。

Hashtable返回的枚举没有此行为。 他们假设您知道自己在做什么,并且如果您在使用其中一个枚举进行迭代时修改地图,则他们的行为AFAIK是未定义的。

最好的方法是查看由每个类的Open JDK实现实现的每个类的源代码; 这样,你可以直接从马的口中得到答案,因为它是:-)

除此之外,从本质上讲,“失败快速”意味着如果检测到另一个线程已修改了目标HashMap,则HashMap上的迭代器将抛出exception – 如果您查看HashMap的源代码,您会看到这是通过简单地检查计数器的预期修改数量来完成。 如果修改计数与Iterator预期的不同,则意味着自上次检查后其他人进入并使用HashMap乱搞,因此Iterator抛出ConcurrentModificationException 。

“非故障快速”迭代器不会费心去检查,并且很乐意在底层数据结构中继续它的业务。 因此,您可以获得一些灵活性(在这种情况下可能具有可疑的灵活性),以换取以后可能遇到的错误; 即尝试访问不再存在的值。

与所有快速失败策略一样,我们的想法是检测到错误越早,就越容易从中恢复或调试。