Java hashmap инициализация одной строкой

Инициализировать 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 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() >;

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

3. Использование Коллекций Java

Если нам нужно создать одноэлементную неизменяемую карту с одной записью, Collections.singletonMap() становится очень полезным:

public static Map createSingletonMap()

Обратите внимание, что карта здесь неизменна, и если мы попытаемся добавить больше записей, она выдаст java.lang.Исключение UnsupportedOperationException.

Мы также можем создать неизменяемую пустую карту с помощью Collections.emptyMap():

Map emptyMap = Collections.emptyMap();

4. Путь Java 8

В этом разделе давайте рассмотрим способы инициализации карты с помощью Java 8 Stream API.

4.1. Использование коллекторов.toMap()

Давайте используем Поток двумерного строкового массива и соберем их в карту:

Map map = Stream.of(new String[][] < < "Hello", "World" >, < "John", "Doe" >, >).collect(Collectors.toMap(data -> data[0], data -> data[1]));

Обратите внимание, что здесь тип данных ключа и значение Map одинаковы.

Чтобы сделать его более универсальным, давайте возьмем массив Объектов и выполним ту же операцию:

Map map = 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. Это еще один подход, при котором у нас разные типы ключей и значений.

Во-первых, давайте использовать Простой ввод реализацию интерфейса Ввода :

Map map = Stream.of( new AbstractMap.SimpleEntry<>("idea", 1), new AbstractMap.SimpleEntry<>("mobile", 2)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Теперь давайте создадим карту с помощью SimpleImmutableEntry реализация:

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));

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

5. Путь Java 9

Java 9 поставляется с различными заводскими методами в интерфейсе Map , которые упрощают создание и инициализацию неизменяемых карт.

Давайте продолжим и рассмотрим эти заводские методы.

5.1. Карта.()

Этот фабричный метод не принимает аргументов, один аргумент и переменные аргументы:

Map emptyMap = Map.of(); Map singletonMap = Map.of("key1", "value"); Map map = Map.of("key1","value1", "key2", "value2");

Обратите внимание, что этот метод поддерживает не более 10 пар ключ-значение.

5.2. Карта записей()

Он похож на 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, давайте продолжим и инициализируем карту с помощью библиотеки 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() также имеет перегруженные версии, которые могут принимать до 5 пар параметров ключ-значение. Вот как будет выглядеть пример с 2 парами параметров:

ImmutableMap.of("key1", "value1", "key2", "value2");

7. Заключение

В этой статье мы рассмотрели различные способы инициализации Map , в частности, для создания пустых, одноэлементных, неизменяемых и изменяемых карт. Как мы видим, с Java 9 в этой области произошли огромные улучшения.

Как всегда, пример исходного кода находится в проекте Github . Примеры Java 9 находятся здесь , а образец гуавы здесь .

Читайте ещё по теме:

Источник

Читайте также:  Html form control name
Оцените статью