UnmodifiableMap (Java Collections) vs ImmutableMap (Google) [дубликат]



этот вопрос уже есть ответ здесь:




  • Неизменяемая и неизменяемая коллекция

    6 ответов



контекст



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



вопрос



Я видел много ссылок на UnmodifiableMap и ImmutableMap онлайн, но я не вижу ничего, сравнивающего/контрастирующего их. Я считаю, что есть веская причина, по которой Google/Guava создали свою собственную версию - может ли кто-нибудь сказать мне, что это такое?

673   4  

4 ответов:

неизменяемая карта все еще может измениться. Это всего лишь view на модифицируемой карте, и изменения в резервной карте будут видны через немодифицируемую карту. Немодифицируемая карта предотвращает изменения только для тех, кто имеет ссылку только на немодифицируемое представление:

Map<String, String> realMap = new HashMap<String, String>();
realMap.put("A", "B");

Map<String, String> unmodifiableMap = Collections.unmodifiableMap(realMap);

// This is not possible: It would throw an 
// UnsupportedOperationException
//unmodifiableMap.put("C", "D");

// This is still possible:
realMap.put("E", "F");

// The change in the "realMap" is now also visible
// in the "unmodifiableMap". So the unmodifiableMap
// has changed after it has been created.
unmodifiableMap.get("E"); // Will return "F". 

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

обновление:

как сообщает комментарий, неизменяемая карта также может быть создана с помощью стандартного API с помощью

Map<String, String> immutableMap = 
    Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap)); 

Это создаст неизменяемый вид на истинную копию данной карты и, таким образом, хорошо эмулирует характеристики ImmutableMap без необходимости добавлять зависимость к Guava.

взгляните на ImmutableMap JavaDoc: doc

есть информация об этом там:

В Отличие От Коллекций.unmodifiableMap (java.утиль.Map), который представляет собой представление отдельной карты, которая все еще может меняться, экземпляр ImmutableMap содержит свои собственные данные и никогда не изменится. ImmutableMap удобен для публичных статических конечных карт ("постоянные карты"), а также позволяет легко сделать "защитную копию" карты, предоставленной вашему классу абонент.

Гуавы Документации

JDK предоставляет Collections.unmodifiableXXX методы, но на наш взгляд, они могут быть громоздкими и многословными; неприятно использовать везде, где вы хотите сделать защитные копии небезопасными: возвращаемые коллекции действительно неизменяемы, если никто не держит ссылку на исходную коллекцию неэффективно: структуры данных по-прежнему имеют все накладные расходы на изменяемые коллекции, включая параллельные проверки модификации, дополнительное пространство в хэш-таблицах, так далее.

ImmutableMap не принимает null значения а Collections.unmodifiableMap() делает. Кроме того, он никогда не изменится после строительства, в то время как UnmodifiableMap может. Из JavaDoc:

неизменяемая карта на основе хэша с надежным заданным пользователем порядком итераций. Не разрешает нулевые ключи или значения.

В Отличие От Коллекций.unmodifiableMap (java.утиль.Map), который представляет собой представление отдельной карты, которая все еще может меняться, экземпляр ImmutableMap содержит свои собственные данные и будет никогда не менять. ImmutableMap удобен для публичных статических конечных карт ("постоянные карты"), а также позволяет легко сделать" защитную копию " карты, предоставленной вашему классу вызывающим абонентом.

Comments

    Ничего не найдено.