Как показано в ответах, существует два способа итерации по Map
(предположим, Map<String, String>
в этих примерах).
Итерация по Map#entrySet()
:
for (Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
Итерация по Map#keySet()
и затем используйте Map#get()
, чтобы получить значение для каждого ключа:
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
Второй может быть более читабельным, но он требует снижения производительностиизлишне вызывая get()
на каждой итерации.Можно утверждать, что создание итератора набора ключей обходится дешевле, поскольку ему не нужно принимать во внимание значения.Но, хотите верьте, хотите нет, keySet().iterator()
создает и использует тот же итератор, что и entrySet().iterator()
.Единственное отличие состоит в том, что в случае keySet()
вызов итератора next()
возвращает it.next().getKey()
вместо it.next()
.
Javadoc AbstractMap#keySet()
доказываетthis:
Метод итератора подкласса возвращает «объект-оболочку» поверх entrySet()
итератора этой карты.
Исходный код AbstractMap
также подтверждает это.Вот выдержка из метода keySet()
(где-то около строки 300 в 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();
}
};
}
Обратите внимание, что читаемость должна быть предпочтительнее преждевременной оптимизации, но важно иметь это в виду.