2016-06-03 2 views
-2

Если отказобезопасный итератор создает клон базовой структуры данных, почему «D» никогда не печатается в программе ниже?Неуправляемый итератор - удаление во время итерации

Map<String, String> acMap = new ConcurrentHashMap<String, String>(); 
acMap.put("A", "Aye"); 
acMap.put("B", "Bee"); 
acMap.put("C", "See"); 
acMap.put("D", "Di"); 

Iterator<String> itr = acMap.keySet().iterator(); 
while(itr.hasNext()) 
{ 
    acMap.remove("D"); 
    System.out.println(itr.next()); 
} 
+0

не предусмотрен эта часть. Благодарю. – Azodious

ответ

1

Как говорится в Javadoc for keySet():

Итератор ... может (но не гарантируется) отражать любые изменения, проведенные после строительства.

Ваш итератор is, отражающий изменения после строительства.

1

Согласно документации любой операции по карте будет отражать на набор ключей, и наоборот. И KeySet#iterator() также не клонирует базовые ds.

ConcurrentHashMap#keySet():

Возвращает представление набора ключей, содержащихся в этой карте. Набор , подкрепленный картой, поэтому изменения на карте отражаются в наборе, а - наоборот. Набор поддерживает удаление элементов, который удаляет соответствующее сопоставление с этой карты с помощью Iterator.remove, Set.remove, removeAll, keepAll и clear.

Read more documentation

See openjdk Implementation

+0

Это более специфично, чем 'keySet()': это 'keySet(). Iterator()', который используется здесь. –

+0

ohk. Одна секунда, я вижу, что 'KeySet # iterator()' возвращает 'KeyIterator', который также не клонирует подслои ds тоже. :) [ссылка] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/ConcurrentHashMap.java) –