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

Gro*_*Man 8 java iterator hashtable hashmap enumerator

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

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

感谢您的关注!

eva*_*ong 15

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

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

对于HashTable枚举:

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

  • Hastable的迭代器是快速失败的.它的枚举不是. (3认同)

小智 5

最好的方法可能是查看每个类的源代码,就像每个类的 Open JDK 实现一样;这样,您就可以直接从马口中得到答案,就像 :-)

除此之外,本质上,这种意义上的“快速失败”意味着如果 HashMap 上的迭代器检测到另一个线程修改了目标 HashMap,它将抛出异常 - 如果您查看 HashMap 的源代码,您会看到这是通过简单地检查计数器的预期修改次数来完成。如果修改计数与 Iterator 预期的不同,则意味着自上次检查以来已经有其他人进来并弄乱了 HashMap,因此 Iterator 抛出ConcurrentModificationException

“非快速失败”迭代器不会费心检查,并愉快地在底层数据结构中进行它的业务。因此,您获得了一些灵活性(在这种情况下可能是可疑的灵活性),以换取以后可能会遇到错误;即尝试访问不再存在的值。

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

  • 不只是另一个线程。如果您在迭代时修改地图,即使在同一个线程中,也会抛出 ConcurrentModification(除非您使用迭代器本身来修改地图) (3认同)