У меня есть структура в HashMap, и мне нужно перебрать файл for
. Как я могу сделать эту итерацию?
Мой код:
import java.util.HashMap;
import java.util.Map;
public class Testeo {
public static void main(String[] args) {
Map<Integer, String> datos = new HashMap<>();
datos.put(1, "uno");
datos.put(2, "dos");
datos.put(3, "tres");
//necesito iterar aquí
}
}
Если вы используете Java 8, вы можете использовать лямбда-выражения для написания компактного кода:
Нет необходимости использовать
EntrySet
, типы данныхk
иv
выводятся автоматически.Невозможно напрямую перебрать HashMap, но вы можете перебрать его.
entrySet()
Например:
Источник: Stack Overflow от Jesper .
Ссылка на ссылку: Как перебирать карту в Java
Существует несколько способов перебора карты в java. Мы рассмотрим наиболее распространенные методы и рассмотрим их преимущества и недостатки. Поскольку все карты в java реализуют интерфейс
Map
, следующие методы будут работать для любой реализацииMap
(HashMap
,TreeMap
,LinkedHashMap
,Hashtable
и т.Метод № 1: перебор входных данных с использованием For-Each.
Он является наиболее распространенным и наиболее предпочтительным в большинстве случаев. Он будет использоваться в том случае, если вам нужны и значение, и ключ.
Обратите внимание, что цикл For-Each был представлен в Java 5, поэтому он работает только в ранних версиях java. Также цикл
For-Each
сработает,NullPointerException
если вы попытаетесь перебрать картуnulo
, поэтому всегда сначала проверяйте наличие ссылокnulas
.Способ №2: Перебор ключей или значений с помощью цикла For-Each.
Если вам нужны только ключи или значения, которые вы можете использовать
keySet
илиvalues
вместоentrySet
.Этот метод дает небольшое преимущество в производительности по сравнению с итерацией
entrySet
(примерно на 10% быстрее) и является более чистым.Способ № 3: Итерация с использованием
Iterator
.Использование дженериков:
Без дженериков:
Вы также можете использовать ту же технику для повторения
keySet
илиvalues
.Этот метод может показаться излишним, но он имеет свои преимущества. Во-первых, это единственный способ перебирать карты в старых версиях java. Еще одной важной особенностью является то, что это единственный метод, который позволяет удалять записи с карты во время итерации с помощью
iterator.remove()
. Если вы попытаетесь сделать это с помощью итерации For-Each, вы получите «непредсказуемые результаты» в соответствии с JavaDoc.С точки зрения производительности это то же самое, что итерация For-Each.
Способ №4: Перебор ключей и поиск значений (неэффективно).
Казалось бы более чистая альтернатива методу №1, но на практике он очень медленный и неэффективный, получение значений по ключу может занимать очень много времени (этот метод в разных реализациях на
Map
20%-200% медленнее, чем метод №1 ). Если у вас установлен FindBugs , он обнаружит его и предупредит о неэффективной итерации. Этого метода следует избегать.Вывод:
Если вам нужны только ключи или значения, используйте метод №2. Если вы застряли на какой-то старой версии Java (менее 5) или планируете удалять записи во время итерации, используйте метод № 3. В противном случае используйте №1.
Интерфейс
Map
(реализованныйHashMap
) имеет метод entrySet() , который возвращает представление карты какSet
. ИSet
это итерации:Обратите внимание, что
Set
возвращенныйentrySet()
не является копией. Он поддерживается им,Map
поэтому все изменения, внесенные в один, повлияют на другой.Это также означает, что в случае с многопоточными приложениями вы должны быть осторожны, чтобы не изменить во
Map
время итерацииSet
таким образом.Также возможно выполнить итерацию экземпляра
java.util.Map
с помощью методаkeySet
. Этот метод возвращает экземплярjava.util.Set
, представляющий собой представление карты. Любое его изменение повлияет на карту.Код :
Выход :
На мой взгляд, во многих случаях следующий код является более интуитивным и практичным: