Iterar através de um HashMap

Duplicar Possível:
Como iterar eficientemente sobre cada input em um ‘Mapa’?

Qual é a melhor maneira de iterar os itens em um HashMap ?

entrySet() através do entrySet() assim:

 public static void printMap(Map mp) { Iterator it = mp.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry)it.next(); System.out.println(pair.getKey() + " = " + pair.getValue()); it.remove(); // avoids a ConcurrentModificationException } } 

Leia mais sobre o Map .

Se você estiver interessado apenas nas chaves, pode percorrer o keySet() do mapa:

 Map map = ...; for (String key : map.keySet()) { // ... } 

Se você precisar apenas dos valores, use values() :

 for (Object value : map.values()) { // ... } 

Finalmente, se você quer tanto a chave quanto o valor, use entrySet() :

 for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // ... } 

Uma ressalva: se você quiser remover itens no meio da iteração, você precisará fazê-lo através de um Iterador (veja a resposta de karim79 ). No entanto, alterar os valores dos itens é OK (consulte Map.Entry ).

Extraído da referência Como Repassar um Mapa em Java :

Existem várias maneiras de iterar em um Map em Java. Vamos examinar os methods mais comuns e revisar suas vantagens e desvantagens. Como todos os mapas em Java implementam a interface Map, as técnicas a seguir funcionarão para qualquer implementação de mapa ( HashMap , LinkedHashMap , LinkedHashMap , Hashtable , etc.)

Método 1 : Iterando inputs usando um loop For-Each.

Este é o método mais comum e é preferível na maioria dos casos. Ele deve ser usado se você precisar das chaves do mapa e dos valores no loop.

 Map map = new HashMap(); for (Map.Entry entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } 

Observe que o loop For-Each foi introduzido no Java 5, portanto, esse método está funcionando apenas em versões mais recentes do idioma. Além disso, um loop For-Each lançará NullPointerException se você tentar iterar em um mapa que seja nulo, portanto, antes de iterar, você deve sempre verificar se há referências nulas.

Método 2 : Iterando chaves ou valores usando um loop For-Each.

Se você precisar apenas de chaves ou valores do mapa, poderá iterar por keySet ou valores em vez de entrySet.

 Map map = new HashMap(); // Iterating over keys only for (Integer key : map.keySet()) { System.out.println("Key = " + key); } // Iterating over values only for (Integer value : map.values()) { System.out.println("Value = " + value); } 

Este método oferece uma pequena vantagem de desempenho em relação à entrySet iteração (cerca de 10% mais rápido) e é mais limpo.

Método # 3 : Iterando usando Iterator.

Usando genéricos:

 Map map = new HashMap(); Iterator> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = entries.next(); System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } 

Sem genéricos:

 Map map = new HashMap(); Iterator entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = (Map.Entry) entries.next(); Integer key = (Integer)entry.getKey(); Integer value = (Integer)entry.getValue(); System.out.println("Key = " + key + ", Value = " + value); } 

Você também pode usar a mesma técnica para iterar sobre keySet ou valores.

Esse método pode parecer redundante, mas tem suas próprias vantagens. Primeiro de tudo, é a única maneira de iterar sobre um mapa em versões mais antigas do Java. A outra característica importante é que é o único método que permite remover inputs do mapa durante a iteração chamando iterator.remove() . Se você tentar fazer isso durante a iteração For-Each, obterá “resultados imprevisíveis” de acordo com o Javadoc .

Do ponto de vista do desempenho, esse método é igual a uma iteração For-Each.

Método 4 : Iterando chaves e procurando valores (ineficientes).

 Map map = new HashMap(); for (Integer key : map.keySet()) { Integer value = map.get(key); System.out.println("Key = " + key + ", Value = " + value); } 

Isso pode parecer uma alternativa mais limpa para o método 1, mas na prática é bastante lento e ineficiente, pois a obtenção de valores por uma chave pode ser demorada (esse método em diferentes implementações de mapa é 20% -200% mais lento que o método # 1 ). Se você tiver o FindBugs instalado, ele irá detectar isso e avisar sobre a iteração ineficiente. Esse método deve ser evitado.

Conclusão:

Se você precisar apenas de chaves ou valores do mapa, use o método # 2. Se você estiver preso a uma versão mais antiga do Java (menos de 5) ou planejando remover inputs durante a iteração, será necessário usar o método # 3. Caso contrário, use o método # 1.

Você pode percorrer as inputs em um Map de várias maneiras. Obtenha cada chave e valor assim:

 Map map = new HashMap(); for(Entry e: map.entrySet()){ System.out.println("Key " + e.getKey()); System.out.println("Value " + e.getValue()); } 

Ou você pode obter a lista de chaves com

 Collection keys = map.keySet(); for(Object key: keys){ System.out.println("Key " + key); System.out.println("Value " + map.get(key)); } 

Se você quiser apenas obter todos os valores e não se preocupar com as chaves, poderá usar:

 Collection values = map.values(); 
 for (Map.Entry item : params.entrySet()) { String key = item.getKey(); String value = item.getValue(); } 

Mais esperto:

 for (String key : hashMap.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); } 

Depende Se você souber que precisará da chave e do valor de cada input, vá até o entrySet . Se você só precisa dos valores, então há o método values() . E se você só precisa das chaves, use keyset() .

Uma prática ruim seria fazer uma iteração em todas as chaves e, em seguida, dentro do loop, sempre map.get(key) para obter o valor. Se você está fazendo isso, então a primeira opção que escrevi é para você.