Итерация 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, отличная от предоставляемой ею функции параллелизма, а именно отказоустойчивый итератор. Вы можете редактировать набор записей - поставить / удалить во время итерации.

Другие вопросы по тегам