Что такое неизменяемая (unmodifiable) коллекция в Java и как её создать?

Ответ

Неизменяемая (unmodifiable) коллекция — это представление (view) существующей коллекции, которое запрещает операции модификации (add, remove, set). При попытке изменения бросается UnsupportedOperationException.

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

Способы создания (до Java 9):

List<String> mutableList = new ArrayList<>(Arrays.asList("A", "B", "C"));
// 1. Через Collections.unmodifiableList()
List<String> unmodifiableView = Collections.unmodifiableList(mutableList);

// 2. Из массива (но это всё ещё представление)
List<String> unmodifiableList2 = Collections.unmodifiableList(
    new ArrayList<>(Arrays.asList("X", "Y", "Z"))
);

mutableList.add("D"); // Сработает, и 'D' появится в unmodifiableView!
unmodifiableView.add("E"); // Выбросит UnsupportedOperationException

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

List<String> trulyImmutableList = List.of("A", "B", "C");
trulyImmutableList.add("D"); // Всегда UnsupportedOperationException

Когда использовать: Для безопасной передачи внутренних коллекций из класса наружу, чтобы клиентский код не мог их изменить.

Ответ 18+ 🔞

Смотри, ну это ж классика, блядь! Неизменяемая коллекция — это как твой старый дед на лавочке, который всем видом показывает: «Не трогай, сука, мои огурцы!». По факту, это просто представление (view), натянутое на реальную коллекцию, которое орёт UnsupportedOperationException, как только ты пытаешься что-то ткнуть, добавить или выкинуть.

Запомни раз и нахуй: это не копия, ёпта! Это как зеркало. Если в исходной коллекции начнётся движ — скажем, добавится элемент — то в этом «неизменяемом» отражении он тоже тут же всплывёт, блядь. Сюрприз!

Как это делали в старые добрые времена (до Java 9):

List<String> mutableList = new ArrayList<>(Arrays.asList("A", "B", "C"));
// 1. Старый добрый Collections.unmodifiableList()
List<String> unmodifiableView = Collections.unmodifiableList(mutableList);

// 2. Из массива (но это всё равно пиздец, а не копия)
List<String> unmodifiableList2 = Collections.unmodifiableList(
    new ArrayList<>(Arrays.asList("X", "Y", "Z"))
);

mutableList.add("D"); // Прокатит! И 'D' волшебным образом окажется в unmodifiableView!
unmodifiableView.add("E"); // А вот тут — пиздец, UnsupportedOperationException в ебало!

А вот в Java 9+ подвезли нормальные инструменты: фабричные методы List.of(), Set.of(), Map.of(). Вот это уже настоящие каменные стены, а не фасад из говна и палок. Создали — и хоть обосрись, нихуя не изменишь.

List<String> trulyImmutableList = List.of("A", "B", "C");
trulyImmutableList.add("D"); // Всегда одно и то же — UnsupportedOperationException, в рот мне чих-пых!

Зачем этот цирк? А чтобы, блядь, когда ты выносишь внутреннюю коллекцию из своего класса наружу, какой-нибудь шутник на стороне не начал там хуйню творить. Дал ему «неизменяемое» представление — и спи спокойно, он максимум посмотрит.