Можно ли изменить данные в иммутабельной коллекции Java?

«Можно ли изменить данные в иммутабельной коллекции Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, напрямую изменить данные в иммутабельной (неизменяемой) коллекции нельзя. Любая попытка модификации (добавление, удаление, изменение элемента) выбросит UnsupportedOperationException.

Почему? Иммутабельность — это гарантия, что состояние объекта не изменится после создания. Это ключевое свойство для потокобезопасности и предсказуемости.

Пример с обёрткой Collections.unmodifiableList:

List<String> mutableList = new ArrayList<>(Arrays.asList("a", "b"));
List<String> unmodifiableList = Collections.unmodifiableList(mutableList);

unmodifiableList.add("c"); // UnsupportedOperationException

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

Пример с полностью иммутабельной коллекцией (Java 9+):

List<String> trulyImmutableList = List.of("a", "b");
trulyImmutableList.add("c"); // UnsupportedOperationException
trulyImmutableList.set(0, "x"); // UnsupportedOperationException

Коллекции, созданные через List.of(), Set.of(), Map.of(), являются полностью неизменяемыми, включая их элементы (для ссылочных типов неизменна ссылка, а не состояние объекта).