Immutable collections
Неизменяемые коллекции — список/множество/словарь, которые нельзя поменять после создания. Удобный способ создать такие — фабричные методы List.of(), Set.of(), Map.of():
List<String> names = List.of("Артур", "Борис");
names.add("Виктор"); // 💥 UnsupportedOperationException — добавлять нельзя
Map<String, Integer> ages = Map.of("Артур", 25, "Борис", 30);
Сравни с обычным изменяемым ArrayList — там add()/remove() работают свободно. List.of() создаёт коллекцию, которая обещает: «я никогда не изменюсь».
Копнуть глубже
Зачем вообще нужны неизменяемые коллекции:
- Безопасность. Передал список в чужой метод — уверен, что его не испортят у тебя за спиной.
- Потокобезопасность. Несколько потоков могут читать одну неизменяемую коллекцию без блокировок — менять её всё равно нельзя.
- Явный контракт. Возвращая
List.of(...)из метода, ты прямо говоришь вызывающему коду: «это просто данные на чтение, не пытайся их менять».
Collections.unmodifiableList() — старый способ обернуть уже существующий изменяемый список:
List<String> mutable = new ArrayList<>(List.of("a", "b"));
List<String> view = Collections.unmodifiableList(mutable);
view.add("c"); // 💥 нельзя через view
mutable.add("c"); // ✅ а напрямую через mutable — всё ещё можно!
Важная разница с List.of(): unmodifiableList — это просто обёртка-вид (view) поверх оригинального списка. Если кто-то меняет оригинал напрямую, эти изменения “просвечивают” через обёртку — это не настоящая неизменяемость, а лишь запрет менять через конкретную ссылку.
🎤 Закрыл тему, если можешь объяснить:
• как создать неизменяемую коллекцию и зачем это нужно;
• чем `List.of()` отличается от `Collections.unmodifiableList()` (если дошёл до 2-го слоя).
• чем `List.of()` отличается от `Collections.unmodifiableList()` (если дошёл до 2-го слоя).