UnmodifiableMap (Java Collections) vs ImmutableMap (Google) [дубликат]
этот вопрос уже есть ответ здесь:
Неизменяемая и неизменяемая коллекция
6 ответов
контекст
Мне нужно вернуть ссылку на карту, которую я использую для кэша данных, и я хочу убедиться, что никто не может изменить их ссылка.
вопрос
Я видел много ссылок на UnmodifiableMap и ImmutableMap онлайн, но я не вижу ничего, сравнивающего/контрастирующего их. Я считаю, что есть веская причина, по которой Google/Guava создали свою собственную версию - может ли кто-нибудь сказать мне, что это такое?
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