Карта / Коллекции / Immutable collections

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-го слоя).