2016-06-03 15 views
-2

Wenn der Fail-Safe-Iterator einen Klon der zugrunde liegenden Datenstruktur erstellt, warum wird 'D' im Programm nie gedruckt?Fail-Safe-Iterator - Entfernung während der Iteration

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

diesen Teil verpasst. Vielen Dank. – Azodious

Antwort

1

Wie es in der Javadoc for keySet() sagt:

Der Iterator ... kann (aber nicht garantiert) spiegeln alle Änderungen nach Konstruktion.

Ihre Iterator ist reflektieren Änderungen nach Konstruktion.

1

Per Dokumentation auf der Karte jede Operation wird auf Keyset reflektieren und umgekehrt. Und KeySet#iterator() klont auch nicht die zugrunde liegenden ds.

ConcurrentHashMap#keySet():

Gibt eine Set Blick auf die in dieser Karte enthaltenen Schlüssel. Das Set wird von der Karte unterstützt, so dass Änderungen an der Karte im Set widergespiegelt werden, und umgekehrt. Der Satz unterstützt das Entfernen von Elementen, wodurch die entsprechende Zuordnung aus dieser Map über die Operationen Iterator.remove, Set.remove, removeAll, retainAll und clear entfernt werden.

Read more documentation

See openjdk Implementation

+0

Es ist spezifischer als die 'keySet()': Es ist die 'keySet(). Iterator()', die hier verwendet wird. –

+0

ohk. Eine Sekunde, was ich sehen kann 'KeySet # iterator()' gibt 'KeyIterator' zurück, das auch die darunterliegenden ds nicht klont. :) [Referenz] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/ConcurrentHashMap.java) –