- Инициализировать HashMap в Java
- Дальнейшее чтение:
- Сравнение двух HashMaps в Java
- Работа с картами с использованием потоков
- 2. Статический инициализатор для статическогоHashMap
- 3. Использование коллекций Java
- 4. Java 8 Way
- 4.1. ИспользуяCollectors.toMap()
- 4.2. Использование потокаMap.Entry
- 4.3. Инициализация неизменной карты
- 5. Java 9 Way
- 5.1. Map.of()с
- 5.2. Map.ofEntries()
- 6. Использование гуавы
- 7. Заключение
- Инициализация хэш-карты в Java
- 1. Обзор
- Дальнейшее чтение:
- Сравнение двух хэш-карт в Java
- Работа С Картами С Использованием Потоков
- 2. Статический инициализатор для статической хэш-карты
- 3. Использование Коллекций Java
- 4. Путь Java 8
- 4.1. Использование коллекторов.toMap()
- 4.2. Использование потока Map.Entry
- 4.3. Инициализация неизменяемой карты
- 5. Путь Java 9
- 5.1. Карта.()
- 5.2. Карта записей()
- 6. Использование Гуавы
- 7. Заключение
- Читайте ещё по теме:
Инициализировать HashMap в Java
В этом руководстве мы узнаем о различных способах инициализацииHashMap in Java.
Мы будем использовать Java 8, а также Java 9.
Дальнейшее чтение:
Сравнение двух HashMaps в Java
Узнайте, как сравнить два HashMaps в Java, а также найти различия между ними
Работа с картами с использованием потоков
Узнайте, как объединить Java Maps и Streams
2. Статический инициализатор для статическогоHashMap
Мы можем инициализироватьHashMap , подозревая блок кодаstatic:
public static Map articleMapOne; static < articleMapOne = new HashMap<>(); articleMapOne.put("ar01", "Intro to Map"); articleMapOne.put("ar02", "Some article"); >
Преимущество этого вида инициализации в том, что карта изменяема, но работает только для статики. Записи можно было добавлять и удалять по мере необходимости.
Давайте продолжим и протестируем:
@Test public void givenStaticMap_whenUpdated_thenCorrect()
Мы также можем инициализировать карту, используя синтаксис двойной скобки:
Map doubleBraceMap = new HashMap() >;
Обратите внимание, чтоwe must try to avoid this initialization technique as it creates an anonymous extra class at every usage, and also holds hidden references to the enclosing object и могут вызвать проблемы с утечкой памяти.
3. Использование коллекций Java
Если нам нужно создать одноэлементную неизменяемую карту с одной записью, очень полезенCollections.singletonMap() :
public static Map createSingletonMap()
Обратите внимание, что карта здесь неизменна, если мы попытаемся добавить больше записей, она выдаст java.lang.UnsupportedOperationException.
Мы также можем создать неизменяемую пустую карту, используяCollections.emptyMap():
Map emptyMap = Collections.emptyMap();
4. Java 8 Way
Здесь, в этом разделе, давайте рассмотрим способы инициализации карты с использованием Java 8Stream API.
4.1. ИспользуяCollectors.toMap()
Давайте возьмемStream из двумерного массиваString и соберем их в карту:
Map map = Stream.of(new String[][] < < "Hello", "World" >, < "John", "Doe" >, >).collect(Collectors.toMap(data -> data[0], data -> data[1]));
Обратите внимание, что здесь тип данных ключа и значениеMap одинаковы.
Чтобы сделать его более общим, давайте возьмем массивObjects and и выполним ту же операцию:
Map map = Stream.of(new Object[][] < < "data1", 1 >, < "data2", 2 >, >).collect(Collectors.toMap(data -> (String) data[0], data -> (Integer) data[1]));
Здесь мы создаем карту ключа какString и значения какInteger.
4.2. Использование потокаMap.Entry
Здесь мы будем использовать экземплярыMap.Entry. . Это еще один подход, в котором у нас есть разные типы ключей и значений.
Сначала воспользуемсяSimpleEntry упрощением синтерфейсаEntry :
Map map = Stream.of( new AbstractMap.SimpleEntry<>("idea", 1), new AbstractMap.SimpleEntry<>("mobile", 2)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Теперь давайте создадим карту, используяSimpleImmutableEntry implementation:
Map map = Stream.of( new AbstractMap.SimpleImmutableEntry<>("idea", 1), new AbstractMap.SimpleImmutableEntry<>("mobile", 2)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
4.3. Инициализация неизменной карты
В некоторых случаях нам нужно инициализировать неизменяемую карту. Это можно сделать, заключивCollectors.toMap() внутрьCollectors.collectingAndThen():
Map map = Stream.of(new String[][] < < "Hello", "World" >, < "John", "Doe" >, >).collect(Collectors.collectingAndThen( Collectors.toMap(data -> data[0], data -> data[1]), Collections:: unmodifiableMap));
Обратите внимание, что нам следует избегать использования такой инициализации с использованиемStreams, , поскольку это может привести к огромным накладным расходам производительности и созданию большого количества объектов мусора только для инициализации карты.
5. Java 9 Way
Java 9 поставляется с различными фабричными методами в интерфейсеMap, которые упрощают создание и инициализацию неизменяемых карт.
Давайте продолжим и рассмотрим эти фабричные методы.
5.1. Map.of()с
Этот фабричный метод не имеет аргументов, одного аргумента и переменных аргументов:
Map emptyMap = Map.of(); Map singletonMap = Map.of("key1", "value"); Map map = Map.of("key1","value1", "key2", "value2");
Обратите внимание, что этот метод поддерживает не более 10 пар ключ-значение.
5.2. Map.ofEntries()
Он похож наMap.of() , но не имеет ограничений на количество пар ключ-значение:
Map map = Map.ofEntries( new AbstractMap.SimpleEntry("name", "John"), new AbstractMap.SimpleEntry("city", "budapest"), new AbstractMap.SimpleEntry("zip", "000000"), new AbstractMap.SimpleEntry("home", "1231231231") );
Обратите внимание, что фабричные методы создают неизменяемые карты, поэтому любая мутация приведет кUnsupportedOperationException.
Кроме того, они не допускают нулевые ключи, а также дубликаты ключей.
Теперь, если нам нужна изменяемая или растущая карта после инициализации, мы можем создать любую из реализаций интерфейсаMap и передать эти неизменяемые карты в конструктор:
Map map = new HashMap ( Map.of("key1","value1", "key2", "value2")); Map map2 = new HashMap ( Map.ofEntries( new AbstractMap.SimpleEntry("name", "John"), new AbstractMap.SimpleEntry("city", "budapest")));
6. Использование гуавы
Теперь, когда мы рассмотрели способы использования ядра Java, давайте продвинемся вперед и инициализируем карту с помощью Apache Guava:
Map articles = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");
Это создаст неизменяемую карту и изменчивую:
Map articles = Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));
МетодImmutableMap.of() размещает аргументы var-args в форме key1, value1, key2, value2 и так далее:
ImmutableMap.of("key1", "value1", "key2", "value2");
7. Заключение
В этой статье мы рассмотрели различные способы инициализацииMap, в частности, для создания пустых, одноэлементных, неизменяемых и изменяемых карт. As you can see, there’s a huge improvement in this field since Java 9.
Как всегда, исходный код примера находится в папкеGithub project. Примеры Java 9 расположеныhere и образец Guavahere.
Инициализация хэш-карты в Java
Изучите различные способы инициализации карты, в частности, для создания пустых, одноэлементных, неизменяемых и изменяемых карт.
1. Обзор
В этом уроке мы узнаем о различных способах инициализации HashMap в Java.
Мы будем использовать Java 8, а также Java 9.
Дальнейшее чтение:
Сравнение двух хэш-карт в Java
Работа С Картами С Использованием Потоков
2. Статический инициализатор для статической хэш-карты
Мы можем инициализировать HashMap с помощью статического блока кода:
public static MaparticleMapOne; static < articleMapOne = new HashMap<>(); articleMapOne.put("ar01", "Intro to Map"); articleMapOne.put("ar02", "Some article"); >
Преимущество такого рода инициализации заключается в том, что карта изменчива, но она будет работать только для статики. Следовательно, записи могут быть добавлены и удалены по мере необходимости.
Давайте пойдем дальше и проверим это:
@Test public void givenStaticMap_whenUpdated_thenCorrect()
Мы также можем инициализировать карту, используя синтаксис двойной скобки:
MapdoubleBraceMap = new HashMap () >;
Обратите внимание, что мы должны стараться избегать этого метода инициализации, потому что он создает анонимный дополнительный класс при каждом использовании, содержит скрытые ссылки на заключающий объект и может вызвать проблемы с утечкой памяти.
3. Использование Коллекций Java
Если нам нужно создать одноэлементную неизменяемую карту с одной записью, Collections.singletonMap() становится очень полезным:
public static Map createSingletonMap()
Обратите внимание, что карта здесь неизменна, и если мы попытаемся добавить больше записей, она выдаст java.lang.Исключение UnsupportedOperationException.
Мы также можем создать неизменяемую пустую карту с помощью Collections.emptyMap():
MapemptyMap = Collections.emptyMap();
4. Путь Java 8
В этом разделе давайте рассмотрим способы инициализации карты с помощью Java 8 Stream API.
4.1. Использование коллекторов.toMap()
Давайте используем Поток двумерного строкового массива и соберем их в карту:
Mapmap = Stream.of(new String[][] < < "Hello", "World" >, < "John", "Doe" >, >).collect(Collectors.toMap(data -> data[0], data -> data[1]));
Обратите внимание, что здесь тип данных ключа и значение Map одинаковы.
Чтобы сделать его более универсальным, давайте возьмем массив Объектов и выполним ту же операцию:
Mapmap = Stream.of(new Object[][] < < "data1", 1 >, < "data2", 2 >, >).collect(Collectors.toMap(data -> (String) data[0], data -> (Integer) data[1]));
В результате мы создаем карту ключа в виде Строки и значения в виде Целого числа .
4.2. Использование потока Map.Entry
Здесь мы будем использовать экземпляры Map.Entry. Это еще один подход, при котором у нас разные типы ключей и значений.
Во-первых, давайте использовать Простой ввод реализацию интерфейса Ввода :
Mapmap = Stream.of( new AbstractMap.SimpleEntry<>("idea", 1), new AbstractMap.SimpleEntry<>("mobile", 2)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Теперь давайте создадим карту с помощью SimpleImmutableEntry реализация:
Mapmap = Stream.of( new AbstractMap.SimpleImmutableEntry<>("idea", 1), new AbstractMap.SimpleImmutableEntry<>("mobile", 2)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
4.3. Инициализация неизменяемой карты
В некоторых случаях использования нам необходимо инициализировать неизменяемую карту. Это можно сделать, обернув Collectors.toMap() внутрь Collectors.collectingAndThen() :
Mapmap = Stream.of(new String[][] < < "Hello", "World" >, < "John", "Doe" >, >).collect(Collectors.collectingAndThen( Collectors.toMap(data -> data[0], data -> data[1]), Collections:: unmodifiableMap));
Обратите внимание, что мы должны избегать использования такой инициализации с помощью Потоки, поскольку это может привести к огромным накладным расходам на производительность, и для инициализации карты создается множество объектов мусора.
5. Путь Java 9
Java 9 поставляется с различными заводскими методами в интерфейсе Map , которые упрощают создание и инициализацию неизменяемых карт.
Давайте продолжим и рассмотрим эти заводские методы.
5.1. Карта.()
Этот фабричный метод не принимает аргументов, один аргумент и переменные аргументы:
MapemptyMap = Map.of(); Map singletonMap = Map.of("key1", "value"); Map map = Map.of("key1","value1", "key2", "value2");
Обратите внимание, что этот метод поддерживает не более 10 пар ключ-значение.
5.2. Карта записей()
Он похож на Map.of () , но не имеет ограничений на количество пар ключ-значение:
Mapmap = Map.ofEntries( new AbstractMap.SimpleEntry ("name", "John"), new AbstractMap.SimpleEntry ("city", "budapest"), new AbstractMap.SimpleEntry ("zip", "000000"), new AbstractMap.SimpleEntry ("home", "1231231231") );
Обратите внимание, что заводские методы создают неизменяемые карты, поэтому любая мутация приведет к исключению UnsupportedOperationException.
Кроме того, они не допускают нулевых ключей или дубликатов ключей.
Теперь, если нам нужна изменяемая или растущая карта после инициализации, мы можем создать любую из реализаций интерфейса Map и передать эти неизменяемые карты в конструктор:
Mapmap = new HashMap ( Map.of("key1","value1", "key2", "value2")); Map map2 = new HashMap ( Map.ofEntries( new AbstractMap.SimpleEntry ("name", "John"), new AbstractMap.SimpleEntry ("city", "budapest")));
6. Использование Гуавы
Поскольку мы рассмотрели способы использования ядра Java, давайте продолжим и инициализируем карту с помощью библиотеки Guava:
Maparticles = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");
Это позволило бы создать неизменяемую карту и создать изменяемую:
Maparticles = Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));
Метод ImmutableMap.of() также имеет перегруженные версии, которые могут принимать до 5 пар параметров ключ-значение. Вот как будет выглядеть пример с 2 парами параметров:
ImmutableMap.of("key1", "value1", "key2", "value2");
7. Заключение
В этой статье мы рассмотрели различные способы инициализации Map , в частности, для создания пустых, одноэлементных, неизменяемых и изменяемых карт. Как мы видим, с Java 9 в этой области произошли огромные улучшения.
Как всегда, пример исходного кода находится в проекте Github . Примеры Java 9 находятся здесь , а образец гуавы здесь .