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

«Что такое неизменяемая (unmodifiable) коллекция в Java и как её создать?» — вопрос из категории Java Core, который задают на 10% собеседований 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

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