- Collections Framework: карта и выбор структуры
Иерархия интерфейсов, сложности операций основных структур, неизменяемые коллекции и принцип выбора по паттерну доступа.
- ArrayList: динамический массив изнутри
Бэкенд-массив, рост в 1.5×, амортизированная O(1), стоимость вставки/удаления и когда массив лучше.
- LinkedList и миф о дешёвой вставке
Двусвязные узлы, реальная стоимость операций, cache locality и почему ArrayList/ArrayDeque почти всегда лучше.
- HashMap изнутри: бакеты, treeify, resize
Таблица бакетов, перемешивание хеша и индекс, превращение цепочки в дерево, ресайз и load factor, контракт ключа.
- LinkedHashMap и LRU-кэш
Порядок вставки против порядка доступа, связанный список поверх HashMap и реализация LRU через removeEldestEntry.
- TreeMap, TreeSet и сортировка
Красно-чёрное дерево, NavigableMap, Comparable против Comparator, согласованность с equals и TimSort.
- Set: HashSet, LinkedHashSet, TreeSet
Почему Set построен поверх Map, три реализации и их гарантии порядка, роль equals/hashCode.
- Очереди и стек: ArrayDeque и PriorityQueue
ArrayDeque как кольцевой буфер и замена Stack, PriorityQueue как бинарная куча и её неотсортированная итерация.
- Итераторы: fail-fast и ConcurrentModificationException
Iterator и ListIterator, механизм modCount, причины CME даже в одном потоке и безопасное удаление.
- Конкурентные коллекции
ConcurrentHashMap без сегментов (CAS + блокировка бакета), запрет null, CopyOnWriteArrayList и BlockingQueue.
- Потоки: создание, состояния и отмена
Thread и Runnable, стоимость платформенных потоков, состояния жизненного цикла, кооперативное прерывание и daemon-потоки.
- synchronized, мониторы и wait/notify
Взаимное исключение и видимость через монитор, reentrancy, guarded blocks с wait/notify и причины deadlock.
- volatile, атомарность и CAS
Разница видимости и атомарности, atomic-классы, compare-and-swap и ABA, контеншн и LongAdder.
- Явные блокировки: ReentrantLock, RW и Condition
Когда synchronized мало, ReentrantLock с tryLock/fairness, ReadWriteLock и StampedLock, Condition вместо wait/notify.
- Пулы потоков и ExecutorService
Зачем пул, параметры ThreadPoolExecutor, ловушки фабрик Executors, выбор размера и корректное завершение.
- Future и CompletableFuture
Ограничения Future, асинхронная композиция CompletableFuture, async-варианты с пулами и обработка ошибок.
- Координация: семафоры, защёлки и барьеры
Semaphore, CountDownLatch, CyclicBarrier, Phaser и Exchanger — что каждый делает и когда выбирать.
- ThreadLocal и Fork/Join
Состояние на поток и утечки в пулах, InheritableThreadLocal, work-stealing в ForkJoinPool и общий пул parallel streams.
- Виртуальные потоки (Project Loom)
Лёгкие потоки JVM, монтирование на carrier, когда их применять, почему не пулят и проблема pinning.
- Дата и время: java.time
Почему java.time вытеснил Date/Calendar, машинное (Instant) и человеческое (LocalDateTime) время, часовые пояса, Duration/Period и потокобезопасный DateTimeFormatter.
- SOLID: пять принципов дизайна
SRP, OCP, LSP, ISP, DIP — что каждая буква значит на самом деле, как выглядит нарушение в Java-коде, чем DIP отличается от DI и IoC.
- DRY, KISS, YAGNI и качество связей
Дублирование знания против дублирования текста, цена преждевременной абстракции, связность и связанность, закон Деметры, каталог code smells и когда рефакторить.
- Тестирование, логирование и базовые паттерны
Unit/integration тесты, уровни логирования, MDC и Singleton без ловушек.
- Равенство: ==, equals и hashCode
Идентичность против логического равенства, контракт equals и hashCode, проблема equals с наследованием и корректная реализация.
- Исключения: иерархия и checked/unchecked
Дерево Throwable, философия checked против unchecked, раскрутка стека и стоимость, цепочки причин и практики обработки.
- Управление ресурсами: try-with-resources
Беды ручного finally, автозакрытие AutoCloseable, suppressed-исключения и разница Closeable/AutoCloseable.
- Дженерики и стирание типов
Типобезопасность на компиляции, механизм type erasure и его последствия, дженерик-методы, ограниченные параметры и опасность raw types.
- Wildcards и правило PECS
Инвариантность дженериков против ковариантных массивов, ? extends/super, и когда что выбирать по PECS.
- Дженерики: массивы, varargs и bridge-методы
Почему дженерики не дружат с массивами, heap pollution и @SafeVarargs, синтетические bridge-методы и reifiable-типы.
- Потоки ввода-вывода: байты, символы, буферы
Байтовые и символьные потоки, кодировки и Charset, буферизация и системные вызовы, декоратор-паттерн и современный файловый API.
- NIO: каналы, буферы и неблокирующий ввод-вывод
io против nio, Channel и ByteBuffer с его flip/clear, Selector и event loop, влияние виртуальных потоков и NIO.2.
- Загрузка классов и class loaders
Жизненный цикл класса (loading/linking/initialization), иерархия загрузчиков с делегированием, триггеры инициализации и изоляция.
- Память JVM и устройство объекта
Runtime data areas, стек против кучи, заголовок объекта и выравнивание, compressed oops и metaspace.
- GC: поколения и продвижение объектов
Гипотеза о поколениях, Eden и Survivor, minor GC через копирование, tenuring и преждевременное продвижение.
- GC: алгоритмы и сборщики
Mark-sweep-compact и копирование, stop-the-world и safepoints, конкурентная маркировка, G1 и ZGC и выбор по throughput/latency.
- GC: корни, достижимость и типы ссылок
GC roots и reachability, strong/soft/weak/phantom-ссылки, Cleaner вместо finalize и утечки через сильные ссылки.
- GC: тюнинг и мониторинг
Ключевые флаги, unified GC-логи, метрики (паузы, throughput, allocation/promotion rate) и диагностика частых проблем.
- Java Memory Model: happens-before и volatile
Зачем нужна модель памяти, видимость и переупорядочивание, отношение happens-before, семантика volatile и final, гонки данных.
- Примитивы, обёртки и Integer cache
Восемь примитивов и их диапазоны, autoboxing, кэш Integer и ловушка ==, NPE при распаковке и цена боксинга.
- Строки: неизменяемость, пул и StringBuilder
Почему String immutable, String pool и intern, конкатенация и StringBuilder, char/code points и compact strings.
- final, static и порядок инициализации
Семантика final (и почему это не immutable), static-члены, порядок инициализации класса и объекта, константы и ловушки.
- Методы: pass-by-value, перегрузка, varargs
Почему Java всегда pass-by-value, разрешение перегрузки на этапе компиляции и устройство varargs.
- Records: компактные носители данных
Что генерирует record, канонический и компактный конструкторы, ограничения и когда применять.
- Sealed-типы и pattern matching
Закрытые иерархии через sealed, pattern matching в instanceof и switch, деконструкция записей и проверка исчерпываемости.
- Современный синтаксис: var, текстовые блоки, switch
Локальный вывод типа var, многострочные текстовые блоки, switch-выражения и другие удобства новых версий.
- JIT, оптимизации и бенчмаркинг
Tiered compilation C1/C2, ключевые оптимизации JIT (inlining, escape analysis), деоптимизация и прогрев, корректные микробенчмарки на JMH.
- ООП и его принципы
Инкапсуляция, наследование, полиморфизм, абстракция — зачем они нужны, как работают внутри и почему композицию предпочитают наследованию.
- Интерфейсы против абстрактных классов
Контракт против частичной реализации, default/static/private-методы, разрешение конфликта default-методов и критерий выбора.
- Проектирование неизменяемых классов
Зачем нужна неизменяемость, рецепт immutable-класса, защитные копии, безопасная публикация и records.
- Порождающие паттерны
Factory Method против статической фабрики Блоха, Abstract Factory, Builder в двух версиях, Prototype и почему clone() считают ошибкой, object pool — с примерами из JDK и Spring.
- Структурные паттерны
Adapter, Decorator, Proxy и чем они отличаются друг от друга, Facade, Composite, Bridge и Flyweight — на примерах java.io, java.lang.reflect.Proxy и Spring AOP.
- Поведенческие паттерны
Strategy, Template Method, Observer, Command, Chain of Responsibility, State, Iterator и Visitor — с примерами из JDK, Spring и заменой паттернов лямбдами и sealed-типами.
- Сериализация и форматы данных
Java serialization и её механика, serialVersionUID, почему её опасно использовать и какие форматы выбирают вместо неё.
- Лямбды и функциональные интерфейсы
SAM-интерфейсы, лямбда против анонимного класса, замыкания и effectively final, ссылки на методы и стандартные интерфейсы.
- Stream API: устройство и ленивый конвейер
Что такое стрим, источники, промежуточные против терминальных, ленивость и short-circuiting, stateful-операции, параллельность и примитивные стримы.
- Collectors и свёртка
reduce против collect, базовые коллекторы и ловушка toMap, группировка и downstream-коллекторы, характеристики и параллельность.
- Optional: явное отсутствие значения
Зачем Optional, orElse против orElseGet, композиция map/flatMap/filter и антипаттерны использования.