Иммутабельность
29 вопросов и ответов в разделе Иммутабельность.
Вопросы этого раздела
- Что такое иммутабельный (неизменяемый) объект?
- Какие преимущества даёт использование иммутабельных объектов?
- Как создать иммутабельный класс в Java?
- Почему класс String является иммутабельным?
- Какие последствия имеет иммутабельность String?
- Почему иммутабельные объекты являются потокобезопасными?
- Что такое ключевое слово final и как оно помогает в создании иммутабельных классов?
- Достаточно ли сделать все поля final для обеспечения иммутабельности?
- Что делать, если поле иммутабельного класса ссылается на мутабельный объект?
- Что такое defensive copy (защитная копия)?
- Когда нужно делать defensive copy (защитную копию)?
- Как защитить коллекцию от изменений?
- Что такое Collections.unmodifiableList() и как это работает?
- В чём разница между shallow copy и deep copy?
- Можно ли наследоваться от иммутабельного класса?
- Почему иммутабельный класс должен быть final?
- Что произойдёт, если переопределить геттер в подклассе иммутабельного класса?
- Как работает String pool и как это связано с иммутабельностью?
- Можно ли изменить значение String через рефлексию?
- Что такое Record и как он помогает создавать иммутабельные классы?
- Почему LocalDate, LocalDateTime иммутабельны?
- В чём преимущества иммутабельных объектов для кэширования?
- Как иммутабельность влияет на производительность?
- Что такое persistent data structures?
- Есть ли недостатки у иммутабельных объектов?
- Как реализовать Builder pattern для иммутабельного класса?
- Можно ли использовать иммутабельные объекты как ключи в HashMap?
- Что произойдёт, если изменить мутабельный ключ в HashMap?
- Как правильно работать с коллекциями в иммутабельных классах?
Навигатор по разделу
29 вопросов для подготовки к собеседованию на Middle Java Developer.
📋 Все вопросы
🗺️ Карта зависимостей тем
┌──────────────────────────────────────────┐
│ ОСНОВЫ ИММУТАБЕЛЬНОСТИ (1-3) │
│ 1. Что такое immutable │
│ 2. Преимущества │
│ 3. Как создать │
└──────────────────┬───────────────────────┘
│
┌──────────────────────────┼──────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────┐
│ STRING И DATE │ │ FINAL И │ │ DEFENSIVE COPY │
│ (4-5, 18, 21) │ │ НАСЛЕДОВАНИЕ │ │ И КОПИРОВАНИЕ │
│ 4. String immut│ │ (7-8, 15-17) │ │ (9-14, 29) │
│ 5. Последствия │ │ 7. final │ │ 9. Мутабельные поля│
│ 18. String pool│ │ 8. Все final? │ │ 10. Defensive copy │
│ 21. LocalDate │ │ 15. Наследов. │ │ 11. Когда делать │
│ │ │ 16. Final class│ │ 12. Защита коллекц │
└───────┬───────┘ │ 17. Геттер │ │ 13. unmodifiable │
│ └───────┬───────┘ │ 14. Shallow vs Deep│
│ │ │ 29. Коллекции │
└────────────────────────┼────────────────└────────┬───────────┘
│ │
┌────────────────────────┼────────────────────────┘
▼ ▼
┌───────────────┐ ┌───────────────┐
│ THREAD-SAFE │ │ ADVANCED │
│ И CACHING │ │ (19-20, 24-28) │
│ (6, 22-23) │ │ 19. Рефлексия │
│ 6. Thread-safe │ │ 20. Record │
│ 22. Кэширование│ │ 24. Persistent │
│ 23. Perform. │ │ 25. Недостатки │
│ │ │ 26. Builder │
│ │ │ 27. Ключ HashMap│
│ │ │ 28. Мутабельн. │
└───────────────┘ └─────────────────┘
🎯 Рекомендуемый порядок изучения
🟢 Уровень Junior (недели 1-2)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Основы | Q1, Q2 | Что такое immutable, зачем нужно |
| 2 | Создание | Q3 | Как создать иммутабельный класс |
| 3 | final | Q7 | Три контекста final |
| 4 | String | Q4, Q5 | Почему String immutable, последствия |
| 5 | Thread-safe | Q6 | Почему immutable = thread-safe |
🟡 Уровень Middle (недели 3-4)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Defensive copy | Q9, Q10, Q11 | Копирование мутабельных полей |
| 2 | Коллекции | Q12, Q13, Q29 | unmodifiableList, List.copyOf |
| 3 | Copy types | Q14 | Shallow vs deep copy |
| 4 | Builder | Q26 | Паттерн для сложных immutable объектов |
| 5 | Record | Q20 | Record vs Lombok @Value vs final class |
| 6 | LocalDate | Q21 | Почему Java Time immutable |
🔴 Уровень Senior (недели 5-6)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Reflection attack | Q19 | Можно ли сломать immutable, module system |
| 2 | Inheritance | Q15, Q16, Q17 | Наследование, sealed classes, overridden getters |
| 3 | Caching | Q22 | Почему immutable идеальны для кэша |
| 4 | Performance | Q23 | Trade-offs, аллокация vs contention |
| 5 | Persistent DS | Q24 | Structural sharing, Vavr |
| 6 | HashMap keys | Q27, Q28 | Immutable keys, mutable key mutation bug |
🔗 Ключевые связи между темами
Тема: Основы
Q1 (Immutable) → Q2 (Преимущества) → Q3 (Как создать)
Тема: final и наследование
Q7 (final) → Q8 (Все final?) → Q15 (Наследование) → Q16 (Final class) → Q17 (Геттер)
Ключевые связи:
- Q7 ↔ Q8: final поля ≠ иммутабельный класс (мутабельные ссылки)
- Q15 ↔ Q16: final class запрещает наследование, sealed — ограничивает
- Q17 ↔ Q29: Геттер возвращает мутабельный объект — нарушение immutable contract
Тема: Defensive Copy и коллекции
Q9 (Мутабельные поля) → Q10 (Defensive copy) → Q11 (Когда делать)
↓
Q12 (Защита коллекции) → Q13 (unmodifiableList) → Q14 (Shallow vs Deep) → Q29 (Коллекции)
Тема: String и Date
Q4 (String immutable) → Q5 (Последствия) → Q18 (String Pool)
Q21 (LocalDate immutable)
Тема: Advanced
Q19 (Рефлексия) → Q20 (Record) → Q24 (Persistent DS)
Q27 (HashMap keys) → Q28 (Mutable key mutation)
🎓 Шпаргалка: что знать для каждого уровня
🟢 Junior
- Immutable = состояние не меняется после создания
- Преимущества: thread-safe, кэшируемый, предсказуемый
- final для класса, полей, методов — три разных значения
- String immutable — безопасность, String Pool, хэширование
🟡 Middle
- Defensive copy: копируем мутабельные поля в конструкторе и геттерах
List.copyOf()vsCollections.unmodifiableList()— независимая копия vs живая обёртка- Shallow copy = копирует контейнер, deep copy = рекурсивно весь граф
- Record = immutable value class с минимум boilerplate
- Builder pattern для объектов с 4+ полями
🔴 Senior
- Reflection на final полях заблокирован (Java 16+, JEP 396)
- Sealed classes (Java 17) как альтернатива final для immutable hierarchies
- Persistent data structures: structural sharing, O(log n) модификация
- Mutable key в HashMap = логическая недоступность (не утечка!)
- Immutable objects = линейное масштабирование на read-heavy нагрузке
- String Pool связан с иммутабельностью: один объект → много ссылок безопасно
📝 Формат каждого файла
Каждый файл содержит:
- 🟢 Junior Level — базовое понимание, простые аналогии, примеры
- 🟡 Middle Level — внутренности, типичные ошибки, практические примеры
- 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
- 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы