Почему мы используем метод entrySet() и используем возвращаемый набор для итерации карты?

Обычно мы пишем это, чтобы получить ключи и значения с карты.

Map m=new HashMap();
Set s=map.entrySet();
Iterator i=s.iterator()
while(s.hasNext()){
    Map.Entry m= (map.Entry) s.next();
    System.out.println(""+m.getKey()+""+ m.getValue());
}

Почему мы итерации используем набор, почему нет прямой карты?

Ответ 1

Это как можно ближе к итерации по карте, поскольку мы можем сказать, хотите ли вы просто клавиши, просто значения или всю запись ключа/значения. Для наборов и списков существует только один вариант, поэтому нет необходимости иметь отдельный метод для этого.

BTW: Так я буду перебирать карту. Обратите внимание на использование generics, for-each и LinkedHashMap, чтобы записи отображались в некотором логическом порядке. TreeMap был бы еще одним хорошим выбором.

Map<K,V> m=new LinkedHashMap<K,V>();
for(Map.Entry<K,V> entry: m.entrySet())
    System.out.println(entry.getKey() + ": " + entry.getValue());

В Java 8 вы можете написать

m.forEach((k, v) -> System.out.println(k + ": " + v));

Ответ 2

Поскольку логически карта представляет собой набор Set пар ключ-значение - это то, что представляет Map.Entry. Итерация - это операция в коллекции, а не карта.

Тем не менее, я часто задавался вопросом, почему Map не реализует Iterable<Map.Entry<K,V>> et al и предоставляет метод iterator() поверх записей карты напрямую, а не требует набора записей (что, безусловно, может предоставить полный API Set.

Ответ 3

Карта - это совокупность пар вещей, справа (Записи). Таким образом, вы можете перебирать записи или перебирать только ключи (map.keySet()) или только по значению (map.values ​​()). Что еще вы хотите, чтобы выполнить итерацию?

Ответ 4

Потому что Java не имеет лучшего синтаксиса для этого. (Ваш может быть улучшен)

Было бы неплохо

for(String key, Integer val : map)
    print(key, val);

или

map.foreach (String key, Integer val) -> print(key, val);

но Java не имеет этих данных.