Gymterview
junior

Как получить коллекцию только для чтения

Через статические методы класса Collections:

Пример
List<String> readOnly = Collections.unmodifiableList(list);
Set<String> readOnly = Collections.unmodifiableSet(set);
Map<K, V> readOnly = Collections.unmodifiableMap(map);

Обертка перехватывает все мутирующие методы (add, remove, set, put) и выбрасывает UnsupportedOperationException. При этом обертка — это view: она не копирует данные, а ссылается на оригинальную коллекцию. Изменения в оригинале будут видны через обертку.

Начиная с Java 9, доступны фабричные методы для создания полностью неизменяемых коллекций:

Пример
List<String> immutable = List.of("a", "b", "c");
Set<String> immutable = Set.of("x", "y");
Map<String, Integer> immutable = Map.of("a", 1, "b", 2);

В отличие от unmodifiable-оберток, коллекции из List.of() / Set.of() / Map.of() — это настоящие immutable-коллекции: не допускают null, не связаны с оригиналом и оптимизированы по памяти.

На собеседовании: назовите Collections.unmodifiableXxx() и List.of()/Set.of()/Map.of() (Java 9+). Объясните разницу: unmodifiable — view на оригинал, of() — полностью immutable.