Что означает Unmodifiable коллекция в отличие от Immutable в Java?

Ответ

Unmodifiable (неизменяемая) коллекция — это представление (view) или обертка вокруг другой, потенциально изменяемой коллекции. Она запрещает операции модификации (add, remove) через свои методы, но отражает все изменения в исходной коллекции.

Immutable (неизменяемая) коллекция — это настоящая неизменяемая структура данных. Её состояние нельзя изменить после создания ни через неё саму, ни через какой-либо другой ссылочный интерфейс.

Ключевое отличие: Unmodifiable коллекция — это защита на уровне ссылки, а Immutable — на уровне данных.

Демонстрация:

import java.util.*;

// 1. Исходная изменяемая коллекция
List<String> mutableList = new ArrayList<>(Arrays.asList("A", "B"));

// 2. Unmodifiable обертка (только защита ссылки)
List<String> unmodifiableList = Collections.unmodifiableList(mutableList);
// unmodifiableList.add("C"); // Выбросит UnsupportedOperationException

// 3. Immutable коллекция (защита данных)
List<String> immutableList = List.of("A", "B");
// immutableList.add("C"); // Выбросит UnsupportedOperationException

// ТЕСТ: Изменяем исходную коллекцию
mutableList.add("C");

System.out.println("mutableList:      " + mutableList);      // [A, B, C]
System.out.println("unmodifiableList: " + unmodifiableList); // [A, B, C] !!! Изменилась!
System.out.println("immutableList:    " + immutableList);    // [A, B]     Осталась прежней.

Вывод: Для передачи данных без риска их изменения всегда используйте истинно неизменяемые коллекции (List.of(), Set.of(), Map.of() из Java 9+). Collections.unmodifiableXXX() полезны только для защиты от случайной модификации через конкретную ссылку.

Ответ 18+ 🔞

Смотри, вот тебе на пальцах, а то в этих терминах можно мозги набекрень вывихнуть, как у того немого Герасима, блядь.

Представь, есть у тебя список дел на бумажке — это изменяемая коллекция. Ты можешь туда писать и вычёркивать, что в голову взбредёт.

Теперь ты берёшь эту бумажку, суёшь её в прозрачный пластиковый файлик и отдаёшь другу. Говоришь: «Смотри, но не трогай, руками не мацай!». Это unmodifiable коллекция. Друг через файлик ничего не исправит, файлик не даст. Но! Если ты, держа этот самый файлик, возьмёшь и ручкой внутри него что-то зачеркнёшь — друг увидит изменения, ёпта! Файлик-то прозрачный! Он защищает только от модификации через себя, но не от того, что творится с оригиналом.

А теперь immutable коллекция — это когда ты берёшь и высекаешь свои дела на каменной плите. Или, на худой конец, фотографируешь ту бумажку и сжигаешь оригинал. Фотографию не исправишь, в камне не поправишь. Это данные в законсервированном виде, нахуй.

Вот, смотри на коде, как это выглядит, а то слова — они такие, ненадёжные:

import java.util.*;

// 1. Оригинальная бумажка (мутабельный список)
List<String> mutableList = new ArrayList<>(Arrays.asList("Купить хлеб", "Не забыть про Герасима"));

// 2. Прозрачный файлик (unmodifiable view)
List<String> unmodifiableList = Collections.unmodifiableList(mutableList);
// unmodifiableList.add("Утопить Муму"); // Руки отсохнут! UnsupportedOperationException

// 3. Каменная плита (immutable коллекция)
List<String> immutableList = List.of("Купить хлеб", "Не забыть про Герасима");
// immutableList.add("Утопить Муму"); // Да ты что, это же гранит! Тоже исключение.

// А теперь смотри магию, блядь, или трагедию — как посмотреть.
// Меняем оригинальную бумажку:
mutableList.add("Утопить Муму");

System.out.println("Оригинальная бумажка: " + mutableList);      // [Купить хлеб, Не забыть про Герасима, Утопить Муму]
System.out.println("Прозрачный файлик:    " + unmodifiableList); // [Купить хлеб, Не забыть про Герасима, Утопить Муму] ОПАЧКИ! Муму уже в воде!
System.out.println("Каменная плита:       " + immutableList);    // [Купить хлеб, Не забыть про Герасима] А тут всё чисто, плита не меняется.

Вот и весь расклад, в рот меня чих-пых. Unmodifiable — это как файлик, защита от дурака, который держит эту конкретную ссылку. А Immutable — это уже состояние души данных, блядь, они застыли навеки, как мумия.

Так что если хочешь передать данные и быть на 146% уверенным, что их никто, даже ты сам по пьяни, не тронет — используй List.of(), Set.of(), Map.of(). А Collections.unmodifiableList() — это когда ты хочешь сказать «смотри, но не трогай», при этом сам оставляешь себе лазейку подправить список, когда все отвернутся. Хитро, да?