Как создать неизменяемый hashMap в Java 11? - PullRequest
5 голосов
/ 21 сентября 2019

Я хотел создать встроенный неизменяемый хэш-код , используя новый фабричный метод Map.ofEntries() в Java 9, например:

Map<Integer, String> map = Map.ofEntries(
    Map.entry(1, "One"),
    Map.entry(2, "Two"),
    Map.entry(3, "Three"));

Затем, к моему удивлению, я смогНе создавайте неизменную хэш-карту таким же образом!Например, следующий код не будет работать.

HashMap<Integer, String> map = HashMap.ofEntries( //not work
    Map.entry(1, "One"),
    Map.entry(2, "Two"),
    Map.entry(3, "Three"));

Затем, когда я хочу проверить, какой тип карты возвращается фабричным методом, я обнаружил следующее note :

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

Поэтому мой вопрос заключается в том, является ли сложность времени доступа неизменяемой карты такой же, как hashMap, которыйо (1)?Если нет, то как создать карту, которая одновременно является неизменной и имеет доступ к o (1)?Было бы лучше, если бы он мог быть встроен.

1 Ответ

13 голосов
/ 21 сентября 2019

Изменчивость или неизменность не имеют прямого отношения к сложности операции доступа в Map.Например, HashMap всегда будет O(1) для операции get(), тогда как TreeMap будет O(log n).Это реализующий класс интерфейса Map, который определяет сложность операций.

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

Map<Integer, String> immutableMap = Collections.unmodifiableMap(mutableMap);

Для ясности HashMap.ofEntries() не будет работать, потому что метод ofEntries() является статическим и определен в интерфейсе Map,ни в одном из реализующих его классов.

И вам не следует беспокоиться о невозможности объявить тип карты как HashMap или какой-либо другой конкретный класс, в любом случае, лучше всего объявлять карту какинтерфейса Map.

Кроме того, если вы использовали версию, более раннюю, чем Java 9, и не возражаете против использования внешней библиотеки, вы можете использовать ImmutableMap из Guava:

Map<Integer, String> immutableMap = ImmutableMap.of(key1, val1, key2, val2);

Возможно, чтение этой статьи прояснит ситуацию немного подробнее.

...