Como se muestra en las respuestas, hay básicamente dos maneras de repetir un Map
(vamos a suponer Map<String, String>
en estos ejemplos).
iterar sobre Map#entrySet()
:
for (Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
iterar sobre Map#keySet()
y luego usar Map#get()
para obtener el valor para cada clave:
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
La segunda es tal vez más legible, pero tiene un costo de rendimiento de llamadas innecesarias get()
en cada iteración. Uno puede argumentar que la creación del iterador del conjunto de claves es menos costoso porque no necesita tener en cuenta los valores. Pero créalo o no, el keySet().iterator()
crea y usa el mismo iterador como entrySet().iterator()
. La única diferencia es que en el caso de keySet()
, la llamada next()
del iterador devuelve it.next().getKey()
en lugar de it.next()
.
El AbstractMap#keySet()
's javadoc demuestra:
método iterador de la subclase devuelve un "objeto envoltorio" sobre este mapa de entrySet()
iterador.
El código fuente AbstractMap
también lo demuestra. He aquí un extracto de keySet()
método (en algún lugar alrededor de la línea 300 en 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();
}
};
}
Tenga en cuenta que la lectura se prefiere en la optimización prematura, pero es importante tener esto en cuenta.
Al comparar esto con la versión de Python, me recuerda por qué renuncié a Java hace años. –