Что касается четырех конкретных способов перемещения по карте в Java, см. подробное объяснение ниже.
Способ 1. Это наиболее распространенный и в большинстве случаев наиболее желательный способ прохождения. Используется, когда требуются и ключ, и значение.
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Integer> запись: map.entrySet()) { System.out.println("Key = " + запись. getKey() + ", Value = " + вход.getValue() }
Метод 2 проходит по ключам или значениям в цикле for-each.
Если вам нужны только ключи или значения на карте, вы можете пройти через keySet или значения вместо использования inputSet.
Map<Integer, Integer> map = new HashMap<Integer, Integer>() // Обходим ключи на карте for (Целочисленный ключ: map.keySet()) { System.out.println("Key = " + key) ) } //Обходим значения на карте for (Целое значение: map.values()) { System.out.println("Value = " + value });
Этот метод имеет немного лучшую производительность, чем обход входного набора (на 10 % быстрее), а код чище.
Третий метод использует итератор для обхода
Используйте дженерики :
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Iterator<Map.Entry<Integer, Integer>> elements = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<Integer, Integer> запись = elements.next(); System.out.println("Key = " + вход.getKey() + ", Значение = " + запись.getValue());
Без использования дженериков:
Карта карты = новые записи HashMap(); Iterator = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry вход = (Map.Entry) elements.next(); Целочисленный ключ = ( Integer)entry.getKey(); Целочисленное значение = (Integer)entry.getValue(); System.out.println("Key = " + key + ", Value = " + значение); }
Вы также можете применить тот же подход к наборам ключей и значениям.
Этот подход кажется излишним, но имеет свои преимущества. Прежде всего, это единственный способ перемещения по карте в старых версиях Java. Еще одним преимуществом является то, что вы можете вызвать iterator.remove() для удаления записей во время перемещения, чего не могут сделать два других метода. Согласно javadoc, если вы попытаетесь использовать этот метод при обходе каждого, результаты будут непредсказуемыми.
С точки зрения производительности этот метод аналогичен производительности обхода для каждого (т. е. метода 2).
Способ 4: Обход путем поиска значений по ключу (низкая эффективность)
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Целочисленный ключ: map.keySet()) { Целое значение = map.get(key); System.out.println("Key = " +ключ+", Value="+value);
В качестве альтернативы первому методу этот код выглядит чище, но на самом деле он довольно медленный и неэффективный; Потому что получение значения из ключа — трудоемкая операция (по сравнению с методом 1 этот метод работает на 20–200 % медленнее в разных реализациях Map). Если у вас установлен FindBugs, он проверит и предупредит вас о неэффективных обходах. Поэтому постарайтесь избегать его использования.
Подвести итог
Если вам нужны только ключи или значения, используйте второй метод. Если используемая вами языковая версия ниже Java 5 или вы планируете удалять записи во время обхода, вам необходимо использовать третий метод. В противном случае используйте первый метод (как ключ, так и значение).