Wie in den Antworten gezeigt, gibt es grundsätzlich zwei Möglichkeiten, ein Map
zu iterieren (die Map<String, String>
in diesen Beispielen annehmen lassen).
Iterate über Map#entrySet()
:
for (Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
Iterate über Map#keySet()
und dann Map#get()
, um den Wert für jeden Schlüssel zu erhalten:
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
Das zweite ist vielleicht mehr lesbar, aber es hat eine Performance-Kosten unnötigerweise zu nennen get()
bei jeder Iteration. Ein Argument könnte sein, dass das Erstellen des Keyset-Iterators weniger teuer ist, da die Werte nicht berücksichtigt werden müssen. Aber glauben Sie es oder nicht, die keySet().iterator()
erstellt und verwendet den gleichen Iterator als entrySet().iterator()
. Der einzige Unterschied ist, dass im Fall der keySet()
der next()
Aufruf des Iterators it.next().getKey()
statt it.next()
zurückgibt.
Die AbstractMap#keySet()
's javadoc beweist dies:
Die Iteratormethode der Unterklasse gibt ein „Wrapper-Objekt“ über dies entrySet()
Iterators Karte.
Der AbstractMap
Quellcode beweist dies auch. Hier ist ein Auszug aus keySet()
Methode (irgendwo um die Linie 300 in Java 1.6):
public Iterator<K> iterator() {
return new Iterator<K>() {
private Iterator<Entry<K,V>> i = entrySet().iterator(); // <-----
public boolean hasNext() {
return i.hasNext();
}
public K next() {
return i.next().getKey(); // <-----
}
public void remove() {
i.remove();
}
};
}
Beachten Sie, dass die Lesbarkeit vorzeitige Optimierung bevorzugt über werden soll, aber es ist wichtig, dies im Auge zu haben.
Der Vergleich mit der Python-Version erinnert mich daran, warum ich Java vor Jahren aufgegeben habe. –