Чем List.of() отличается от Arrays.asList() по мутабельности

Вопрос звучит как проверка синтаксиса, но проверяет понимание разных уровней неизменяемости коллекций в Java. Ответ «оба immutable» неверен — и это ловит почти каждого, кто отвечает по памяти, а не по факту.

Arrays.asList() возвращает список фиксированного размера поверх массива. add() и remove() бросают UnsupportedOperationException, а set() спокойно работает и меняет исходный массив — это не иммутабельность, а ограничение на изменение размера.

List.of() из Java 9 — настоящая неизменяемая коллекция. Любая попытка модификации, включая set(), бросает UnsupportedOperationException. Плюс — она не допускает null-элементов, в отличие от Arrays.asList().

List a = Arrays.asList("x", "y"); a.set(0, "z"); // работает

List b = List.of("x", "y"); b.set(0, "z"); // UnsupportedOperationException

Следующий вопрос обычно про Collections.unmodifiableList() — это третий вариант, ещё более коварный. Он не иммутабельный сам по себе, а просмотровая обёртка: изменения в исходном списке видны через неё, хотя сама обёртка модификацию запрещает. Три метода — три разных гарантии, и на собесе часто просят назвать все три и объяснить разницу без подсказки.

Три похожих метода, три разных контракта — путаница здесь стоит балла на собесе, а не просто неточности в формулировке.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки