Ответ
Неизменяемая (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, в рот мне чих-пых!
Зачем этот цирк? А чтобы, блядь, когда ты выносишь внутреннюю коллекцию из своего класса наружу, какой-нибудь шутник на стороне не начал там хуйню творить. Дал ему «неизменяемое» представление — и спи спокойно, он максимум посмотрит.