Что именно вы подразумеваете под итератором HashMap - он работает быстро, а перечислитель HashTable - нет? - PullRequest
8 голосов
/ 06 января 2012

Я искал разницу между двумя классами, и этот вопрос возник во многих ответах, и этот блог является источником: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html

Однако я не совсем понимаю. Может кто-нибудь уточнить это? Возможно с примером?

Спасибо, что заглянули!

Ответы [ 3 ]

14 голосов
/ 06 января 2012

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
    }
3 голосов
/ 06 января 2012

Лучший способ - это, вероятно, посмотреть на источник для каждого класса, реализованный реализацией Open JDK для каждого класса;таким образом, вы можете получить свой ответ прямо изо рта лошади, как если бы это было: -)

Это, по сути, «сбои-быстрые» в этом смысле означает, что итератор над HashMap сгенерирует исключениеесли он обнаружит, что другой поток изменил целевой HashMap - если вы посмотрите в источнике HashMap, вы увидите, что это делается путем простой проверки счетчика количества ожидаемых изменений.Если количество модификаций отличается от ожидаемого Итератора, это означает, что кто-то еще вошел после последней проверки и запутался с HashMap, и поэтому Итератор выдает ConcurrentModificationException .

Итератор, не подверженный сбоям, не потрудится проверить и с удовольствием проведет свой бизнес в базовой структуре данных.Следовательно, вы получаете некоторую гибкость (в данном случае, вероятно, сомнительную гибкость) в обмен на возможную ошибку позже;то есть, пытаясь получить доступ к значению, которого больше нет.

Как и во всех отказоустойчивых стратегиях, идея состоит в том, что чем раньше обнаружена ошибка, тем легче ее восстановить.или отладка.

3 голосов
/ 06 января 2012

При вызове iterator.next(), если были внесены какие-либо изменения между моментом создания итератора и моментом вызова next(), немедленно генерируется исключение ConcurrentModificationException.Вот что означает отказоустойчивость.

В перечислениях, возвращаемых Hashtable, такого поведения нет.Они предполагают, что вы знаете, что делаете, и их поведение, AFAIK, не определено, если вы изменяете карту, перебирая ее, используя одно из перечислений.

...