11

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

但是我并不完全明白。有人可以详细说明吗?也许举个例子?

感谢您的光临!

4

3 回答 3

16

Fail-fast 意味着当您在迭代时尝试修改内容时,它将失败并抛出 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
    }
于 2012-01-05T22:58:45.640 回答
5

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

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

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

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

于 2012-01-05T22:57:00.400 回答
3

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

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

于 2012-01-05T22:56:49.107 回答