Рубрики
Без рубрики

Неизменяемые реализации карт в Java

Исследуйте различия между неизменяемой картой и неизменяемой картой в Java.

Автор оригинала: baeldung.

1. Обзор

Иногда предпочтительнее запретить изменения в java.util.Map , например, совместное использование данных только для чтения между потоками. Для этой цели мы можем использовать либо Неизменяемую карту, либо Неизменяемую карту.

В этом кратком уроке мы увидим, в чем разница между ними. Затем мы представим различные способы создания Неизменяемой карты.

2. Неизменяемый и неизменяемый

Неизменяемая карта-это просто оболочка над изменяемой картой, и она не позволяет вносить в нее изменения напрямую:

Map mutableMap = new HashMap<>();
mutableMap.put("USA", "North America");

Map unmodifiableMap = Collections.unmodifiableMap(mutableMap);
assertThrows(UnsupportedOperationException.class,
  () -> unmodifiableMap.put("Canada", "North America"));

Но базовая изменяемая карта все еще может быть изменена, и изменения также отражаются в немодифицируемой карте:

mutableMap.remove("USA");
assertFalse(unmodifiableMap.containsKey("USA"));
		
mutableMap.put("Mexico", "North America");
assertTrue(unmodifiableMap.containsKey("Mexico"));

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

3. Неизменяемая карта Гуавы

Guava предоставляет неизменяемые версии каждого java.util . Карта использование Неизменяемой карты . Он выдает исключение UnsupportedOperationException всякий раз, когда мы пытаемся его изменить.

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

Теперь мы обсудим различные способы создания экземпляров ImmutableMap.

3.1. Использование метода copyOf()

Во-первых, давайте используем метод ImmutableMap.copyOf () , который возвращает копию всех записей, как на исходной карте:

ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap);
assertTrue(immutableMap.containsKey("USA"));

Он не может быть изменен прямо или косвенно:

assertThrows(UnsupportedOperationException.class,
  () -> immutableMap.put("Canada", "North America"));
		
mutableMap.remove("USA");
assertTrue(immutableMap.containsKey("USA"));
		
mutableMap.put("Mexico", "North America");
assertFalse(immutableMap.containsKey("Mexico"));

3.2. Использование метода builder()

Мы также можем использовать метод ImmutableMap.builder() для создания копии всех записей, как на исходной карте.

Кроме того, мы можем использовать этот метод для добавления дополнительных записей, которых нет в исходной карте:

ImmutableMap immutableMap = ImmutableMap.builder()
  .putAll(mutableMap)
  .put("Costa Rica", "North America")
  .build();
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));

Как и в предыдущем примере, мы не можем изменить его прямо или косвенно:

assertThrows(UnsupportedOperationException.class,
  () -> immutableMap.put("Canada", "North America"));
		
mutableMap.remove("USA");
assertTrue(immutableMap.containsKey("USA"));
		
mutableMap.put("Mexico", "North America");
assertFalse(immutableMap.containsKey("Mexico"));

3.3. Использование метода()

Наконец, мы можем использовать Неизменная карта.() метод создания неизменяемой карты с набором записей, предоставляемых на лету. Он поддерживает не более пяти пар ключ/значение:

ImmutableMap immutableMap
  = ImmutableMap.of("USA", "North America", "Costa Rica", "North America");
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));

Мы также не можем изменить его:

assertThrows(UnsupportedOperationException.class,
  () -> immutableMap.put("Canada", "North America"));

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

В этой краткой статье мы обсудили различия между Неизменяемой картой и Неизменяемой картой.

Мы также рассмотрели различные способы создания неизменяемой карты Гуавы.

И, как всегда, полные примеры кода доступны на GitHub .