Подтвердить что ты не робот

В чем разница между google ImmutableList и Collections.unmodifiableList()?

Из ImmutableList javadocs:

В отличие от Collections.unmodifiableList(java.util.List), который представляет собой отдельный которые все еще могут измениться, экземпляр ImmutableList содержит собственные личные данные и никогда не будут изменение. ImmutableList удобен для публичных статических окончательных списков ( "постоянные списки" ), а также легко сделать "защитную копию" список, предоставленный вашему классу вызывающий абонент.

Означает ли это, что:

  • Если у меня есть объект ImmutableList Dimension (например), то я не могу изменить какой-либо объект Dimension в нем?
  • и если у меня есть Collections.unmodifiableList(список) объектов Dimension, то я могу не только добавлять или удалять любой объект, но я могу их изменить (например, метод setDimension (ширина, высота))?
4b9b3361

Ответ 1

Нет, неизменяемость применяется только к количеству и ссылкам объектов в коллекции и не затрагивает изменчивость объектов, которые вы помещаете в коллекцию.

Что неизмеримый список выигрывает над стандартным JDK Collections.unmodifiableList, так это то, что, используя ImmutableList, вы гарантированно, что ссылки на объекты, их порядок и размер списка не могут быть изменены из любого источника. С Collections.unmodifiableList, если что-то еще имеет ссылку на базовый список, этот код может изменить список, даже если у вас есть ссылка на немодифицируемый список.

Если вам нужна истинная неизменность, вы должны заполнить список неизменяемыми объектами.

Ответ 2

Использование Collections.unmodifiableList создает обертку вокруг вашего списка. если базовый список изменяется, также отображается ваш немодифицируемый список.

Как говорится в документации, код Google создает копию. Это более дорогое вычисление и потребляет больше памяти, но если кто-то изменяет исходный список, он не может повлиять на ImmutableList.

Ни один из них не позволит вам изменить объект в списке или его поля или поля полей и т.д.

Ответ 3

ImmutableList похож на Collections.unmodifiableList( new ArrayList( list ) ). Обратите внимание, что созданный ArrayList не назначается полю или переменной.

Ответ 4

  • Нет, отдельные объекты могут быть изменены. Коллекция действительно хранит ссылки только на содержащиеся объекты, а не на полную копию каждого объекта.
  • Вы можете изменить список, изменив родительскую коллекцию, которую вы назвали Collections.unmodifiableList(list) on. Но да, вы можете использовать setDimension для изменения сохраненного элемента списка.

Ответ 5

Вы также можете взглянуть на этот вопрос (какая разница между Collections.unmodifiableSet() и ImmutableSet от Guava).