Из обзора структуры коллекций :
Коллекции , которые не поддерживают операции модификации (такие , как
add
,remove
иclear
) называются нередактируемым . Коллекции, которые не являются неизменяемыми, являются изменяемыми .Коллекции, которые дополнительно гарантируют, что никакие изменения в
Collection
объекте не будут видны, называются неизменяемыми . Коллекции, которые не являются неизменяемыми, являются изменяемыми .
Я не могу понять различие.
В чем разница между неизменным и неизменным здесь?
источник
list
. Если что-то может позже позвонить,list.add(10)
тоcoll
отразит это изменение, поэтому нет, я бы не назвал это неизменным.Собственно,
unModifiable
коллекция - это представление, поэтому косвенно она все еще может быть «модифицирована» из некоторой другой ссылки, которая может быть изменена. Кроме того, это просто представление только для чтения другой коллекции, когда исходная коллекция изменяется, unModifiable Collection всегда будет отображать последние значения.Однако
immutable
коллекция может рассматриваться как копия только для чтения другой коллекции и не может быть изменена. В этом случае, когда исходная коллекция изменяется, неизменяемая коллекция не отражает измененияВот тестовый пример, чтобы визуализировать эту разницу.
Вывод
источник
modifiableList
иunModifiableList
увеличенныйimmutableList
размер не изменилисьnew ArrayList<String>(modifiableList)
immutableList, который нельзя изменитьnew ArrayList<String>(modifiableList)
из-заnew
? Спасибо.Я думаю, что основное отличие состоит в том, что владелец изменяемой коллекции может захотеть предоставить доступ к коллекции к какому-либо другому коду, но обеспечить такой доступ через интерфейс, который не позволяет другому коду изменять коллекцию (сохраняя эту возможность на владение кодом). Таким образом, коллекция не является неизменной, но некоторым пользователям не разрешается изменять коллекцию.
В руководстве Oracle по Java Collection Wrapper сказано следующее (выделение добавлено):
источник
Если мы говорим о JDK
Unmodifiable*
против гуавыImmutable*
, на самом деле разница также в производительности . Неизменяемые коллекции могут быть как более быстрыми, так и более эффективными, если они не являются обертками вокруг обычных коллекций (реализации JDK являются обертками). Ссылаясь на команду гуавы :JDK предоставляет методы Collections.unmodifiableXXX, но, по нашему мнению, они могут быть
<...>
источник
List.of(...)
, действительно, копируется дважды!Цитировать учебники по Java ™ :
(акцент мой)
Это действительно подводит итог.
источник
Как отмечено выше, немодифицируемое не похоже на неизменяемое, потому что немодифицируемое собрание может быть изменено, если, например, немодифицируемая коллекция имеет базовую коллекцию делегатов, на которую ссылается какой-либо другой объект, и этот объект изменяет ее.
Что касается неизменности, это даже не четко определены. Однако обычно это означает, что объект «не изменится», но это необходимо определить рекурсивно. Например, я могу определить неизменяемый для классов, чьи переменные экземпляра являются примитивами и чьи методы не содержат аргументов и возвращают примитивы. Затем методы рекурсивно позволяют переменным экземпляра быть неизменными, а все методы содержат аргументы, которые являются неизменяемыми и возвращают неизменные значения. Методы должны гарантированно возвращать одно и то же значение с течением времени.
Предполагая, что мы можем сделать это, есть также концепция, безопасная для потоков. И вы можете быть уверены, что неизменяемость (или неизменяемость во времени) также подразумевает безопасность потоков. Однако это не тот случайи это главное замечание, которое я здесь делаю, которое еще не было отмечено в других ответах. Я могу создать неизменный объект, который всегда возвращает одинаковые результаты, но не является поточно-ориентированным. Чтобы увидеть это, предположим, что я создаю неизменную коллекцию, поддерживая добавления и удаления с течением времени. Теперь неизменяемая коллекция возвращает свои элементы, просматривая внутреннюю коллекцию (которая может меняться со временем), а затем (внутренне) добавляя и удаляя элементы, которые были добавлены или удалены после создания коллекции. Ясно, что хотя коллекция всегда будет возвращать одни и те же элементы, она не является поточно-ориентированной, просто потому, что никогда не изменит значение.
Теперь мы можем определить неизменяемость как объекты, которые являются потокобезопасными и никогда не изменятся. Существуют рекомендации по созданию неизменяемых классов, которые обычно приводят к таким классам, однако следует помнить, что могут быть способы создания неизменяемых классов, которые требуют внимания к безопасности потоков, например, как описано в приведенном выше примере коллекции «снимок».
источник
Учебные руководства Java ™ говорят следующее:
Я думаю, что это достаточно хорошее объяснение, чтобы понять разницу.
источник