Статьи: Java
Java от junior до senior: ООП и основы языка, коллекции изнутри, многопоточность, JVM и GC, Stream API, паттерны.
Основы языка
4- 01Примитивы, обёртки и Integer cache
Восемь примитивов и их диапазоны, autoboxing, кэш Integer и ловушка ==, NPE при распаковке и цена боксинга.
- 02Строки: неизменяемость, пул и StringBuilder
Почему String immutable, String pool и intern, конкатенация и StringBuilder, char/code points и compact strings.
- 03final, static и порядок инициализации
Семантика final (и почему это не immutable), static-члены, порядок инициализации класса и объекта, константы и ловушки.
- 04Методы: pass-by-value, перегрузка, varargs
Почему Java всегда pass-by-value, разрешение перегрузки на этапе компиляции и устройство varargs.
ООП
3- 05ООП и его принципы
Инкапсуляция, наследование, полиморфизм, абстракция — зачем они нужны, как работают внутри и почему композицию предпочитают наследованию.
- 06Интерфейсы против абстрактных классов
Контракт против частичной реализации, default/static/private-методы, разрешение конфликта default-методов и критерий выбора.
- 07Проектирование неизменяемых классов
Зачем нужна неизменяемость, рецепт immutable-класса, защитные копии, безопасная публикация и records.
Принципы проектирования
2- 08SOLID: пять принципов дизайна
SRP, OCP, LSP, ISP, DIP — что каждая буква значит на самом деле, как выглядит нарушение в Java-коде, чем DIP отличается от DI и IoC.
- 09DRY, KISS, YAGNI и качество связей
Дублирование знания против дублирования текста, цена преждевременной абстракции, связность и связанность, закон Деметры, каталог code smells и когда рефакторить.
Равенство, equals и hashCode
1Коллекции
10- 11Collections Framework: карта и выбор структуры
Иерархия интерфейсов, сложности операций основных структур, неизменяемые коллекции и принцип выбора по паттерну доступа.
- 12ArrayList: динамический массив изнутри
Бэкенд-массив, рост в 1.5×, амортизированная O(1), стоимость вставки/удаления и когда массив лучше.
- 13LinkedList и миф о дешёвой вставке
Двусвязные узлы, реальная стоимость операций, cache locality и почему ArrayList/ArrayDeque почти всегда лучше.
- 14HashMap изнутри: бакеты, treeify, resize
Таблица бакетов, перемешивание хеша и индекс, превращение цепочки в дерево, ресайз и load factor, контракт ключа.
- 15LinkedHashMap и LRU-кэш
Порядок вставки против порядка доступа, связанный список поверх HashMap и реализация LRU через removeEldestEntry.
- 16TreeMap, TreeSet и сортировка
Красно-чёрное дерево, NavigableMap, Comparable против Comparator, согласованность с equals и TimSort.
- 17Set: HashSet, LinkedHashSet, TreeSet
Почему Set построен поверх Map, три реализации и их гарантии порядка, роль equals/hashCode.
- 18Очереди и стек: ArrayDeque и PriorityQueue
ArrayDeque как кольцевой буфер и замена Stack, PriorityQueue как бинарная куча и её неотсортированная итерация.
- 19Итераторы: fail-fast и ConcurrentModificationException
Iterator и ListIterator, механизм modCount, причины CME даже в одном потоке и безопасное удаление.
- 20Конкурентные коллекции
ConcurrentHashMap без сегментов (CAS + блокировка бакета), запрет null, CopyOnWriteArrayList и BlockingQueue.
Исключения и ресурсы
2- 21Исключения: иерархия и checked/unchecked
Дерево Throwable, философия checked против unchecked, раскрутка стека и стоимость, цепочки причин и практики обработки.
- 22Управление ресурсами: try-with-resources
Беды ручного finally, автозакрытие AutoCloseable, suppressed-исключения и разница Closeable/AutoCloseable.
Многопоточность
9- 23Потоки: создание, состояния и отмена
Thread и Runnable, стоимость платформенных потоков, состояния жизненного цикла, кооперативное прерывание и daemon-потоки.
- 24synchronized, мониторы и wait/notify
Взаимное исключение и видимость через монитор, reentrancy, guarded blocks с wait/notify и причины deadlock.
- 25volatile, атомарность и CAS
Разница видимости и атомарности, atomic-классы, compare-and-swap и ABA, контеншн и LongAdder.
- 26Явные блокировки: ReentrantLock, RW и Condition
Когда synchronized мало, ReentrantLock с tryLock/fairness, ReadWriteLock и StampedLock, Condition вместо wait/notify.
- 27Пулы потоков и ExecutorService
Зачем пул, параметры ThreadPoolExecutor, ловушки фабрик Executors, выбор размера и корректное завершение.
- 28Future и CompletableFuture
Ограничения Future, асинхронная композиция CompletableFuture, async-варианты с пулами и обработка ошибок.
- 29Координация: семафоры, защёлки и барьеры
Semaphore, CountDownLatch, CyclicBarrier, Phaser и Exchanger — что каждый делает и когда выбирать.
- 30ThreadLocal и Fork/Join
Состояние на поток и утечки в пулах, InheritableThreadLocal, work-stealing в ForkJoinPool и общий пул parallel streams.
- 31Виртуальные потоки (Project Loom)
Лёгкие потоки JVM, монтирование на carrier, когда их применять, почему не пулят и проблема pinning.
JVM и сборка мусора
7- 32Загрузка классов и class loaders
Жизненный цикл класса (loading/linking/initialization), иерархия загрузчиков с делегированием, триггеры инициализации и изоляция.
- 33Память JVM и устройство объекта
Runtime data areas, стек против кучи, заголовок объекта и выравнивание, compressed oops и metaspace.
- 34GC: поколения и продвижение объектов
Гипотеза о поколениях, Eden и Survivor, minor GC через копирование, tenuring и преждевременное продвижение.
- 35GC: алгоритмы и сборщики
Mark-sweep-compact и копирование, stop-the-world и safepoints, конкурентная маркировка, G1 и ZGC и выбор по throughput/latency.
- 36GC: корни, достижимость и типы ссылок
GC roots и reachability, strong/soft/weak/phantom-ссылки, Cleaner вместо finalize и утечки через сильные ссылки.
- 37GC: тюнинг и мониторинг
Ключевые флаги, unified GC-логи, метрики (паузы, throughput, allocation/promotion rate) и диагностика частых проблем.
- 38Java Memory Model: happens-before и volatile
Зачем нужна модель памяти, видимость и переупорядочивание, отношение happens-before, семантика volatile и final, гонки данных.
Дженерики
3- 39Дженерики и стирание типов
Типобезопасность на компиляции, механизм type erasure и его последствия, дженерик-методы, ограниченные параметры и опасность raw types.
- 40Wildcards и правило PECS
Инвариантность дженериков против ковариантных массивов, ? extends/super, и когда что выбирать по PECS.
- 41Дженерики: массивы, varargs и bridge-методы
Почему дженерики не дружат с массивами, heap pollution и @SafeVarargs, синтетические bridge-методы и reifiable-типы.
Лямбды и Stream API
4- 42Лямбды и функциональные интерфейсы
SAM-интерфейсы, лямбда против анонимного класса, замыкания и effectively final, ссылки на методы и стандартные интерфейсы.
- 43Stream API: устройство и ленивый конвейер
Что такое стрим, источники, промежуточные против терминальных, ленивость и short-circuiting, stateful-операции, параллельность и примитивные стримы.
- 44Collectors и свёртка
reduce против collect, базовые коллекторы и ловушка toMap, группировка и downstream-коллекторы, характеристики и параллельность.
- 45Optional: явное отсутствие значения
Зачем Optional, orElse против orElseGet, композиция map/flatMap/filter и антипаттерны использования.
Дата и время
1Ввод-вывод и NIO
2- 47Потоки ввода-вывода: байты, символы, буферы
Байтовые и символьные потоки, кодировки и Charset, буферизация и системные вызовы, декоратор-паттерн и современный файловый API.
- 48NIO: каналы, буферы и неблокирующий ввод-вывод
io против nio, Channel и ByteBuffer с его flip/clear, Selector и event loop, влияние виртуальных потоков и NIO.2.
Сериализация
1Паттерны проектирования
3- 50Порождающие паттерны
Factory Method против статической фабрики Блоха, Abstract Factory, Builder в двух версиях, Prototype и почему clone() считают ошибкой, object pool — с примерами из JDK и Spring.
- 51Структурные паттерны
Adapter, Decorator, Proxy и чем они отличаются друг от друга, Facade, Composite, Bridge и Flyweight — на примерах java.io, java.lang.reflect.Proxy и Spring AOP.
- 52Поведенческие паттерны
Strategy, Template Method, Observer, Command, Chain of Responsibility, State, Iterator и Visitor — с примерами из JDK, Spring и заменой паттернов лямбдами и sealed-типами.
Тестирование и логирование
1Современная Java
3- 54Records: компактные носители данных
Что генерирует record, канонический и компактный конструкторы, ограничения и когда применять.
- 55Sealed-типы и pattern matching
Закрытые иерархии через sealed, pattern matching в instanceof и switch, деконструкция записей и проверка исчерпываемости.
- 56Современный синтаксис: var, текстовые блоки, switch
Локальный вывод типа var, многострочные текстовые блоки, switch-выражения и другие удобства новых версий.
JIT и производительность
1Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.