Come mostrato nelle risposte, ci sono fondamentalmente due modi per iterare su una Map
(supponiamo Map<String, String>
in questi esempi).
iterare Map#entrySet()
:
for (Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
iterare Map#keySet()
e quindi utilizzare Map#get()
per ottenere il valore per ogni tasto:
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
la seconda è forse più leggibile, ma ha un costo di prestazioni di chiamata inutilmente get()
ad ogni iterazione. Si potrebbe argomentare che la creazione dell'iteratore di keyset è meno costosa in quanto non è necessario tenere conto dei valori. Ma ci crediate o no, lo keySet().iterator()
crea e utilizza lo stesso iteratore come entrySet().iterator()
. L'unica differenza è che nel caso dello keySet()
la chiamata di iteratore next()
restituisce it.next().getKey()
anziché it.next()
.
Il AbstractMap#keySet()
's javadoc dimostra questo:
metodo iteratore del sottoclasse restituisce un "oggetto wrapper" over entrySet()
iteratore di questa mappa.
Il codice sorgente AbstractMap
lo dimostra. Ecco un estratto di keySet()
metodo (da qualche parte attorno alla riga 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();
}
};
}
Si noti che la leggibilità dovrebbe essere preferito su ottimizzazione prematura, ma è importante avere questo in mente.
Confrontando questo con la versione di Python mi viene in mente perché ho abbandonato Java anni fa. –