Итерация ConcurrentHashmap
Мой текущий код выполняет итерацию ConcurrentHashMap с использованием цикла Java 5 для каждого. В приведенном ниже коде, поскольку неявный итератор является отказоустойчивым, я не сталкиваюсь с ConcurrentModificationException.
Map<Long,String> map = new ConcurrentHashMap <Long,String>();
map.put(1L, "1");
map.put(2L, "2");
System.out.println("map size before" + map.size());
for ( Long id : map.keySet()) {
map.remove(id);
}
System.out.println("map size after" + map.size());
Есть ли причина того, почему я должен изменить код, чтобы использовать явный итератор и запустить iterator.remove()
2 ответа
Есть ли причина того, почему я должен изменить код, чтобы использовать явный итератор и запустить iterator.remove()
Под прикрытием итератор, который CHM использует вызовы map.remove(key)
сам. Смотрите код ниже.
Тем не менее, удаление из итератора - это правильный шаблон, и всегда полезно использовать общие шаблоны, если это возможно. Например, если вы копируете свой код для использования другой карты или понижаете версию карты в этом коде, чтобы она не была CHM, тогда ваш код не сломается, если вы используете итератор.
abstract class HashIterator {
...
public void remove() {
if (lastReturned == null)
throw new IllegalStateException();
ConcurrentHashMap.this.remove(lastReturned.key);
lastReturned = null;
}
Существует еще одна очень важная особенность для concurrenthmp, отличная от предоставляемой ею функции параллелизма, а именно отказоустойчивый итератор. Вы можете редактировать набор записей - поставить / удалить во время итерации.