Java-интервью консервативны: ядро языка, коллекции, исключения, немного многопоточности и Spring. Сюрпризов мало — валятся на глубине уточняющих вопросов. К каждому пункту — что хочет услышать интервьюер.
== — ссылки, equals — содержимое; переопределил equals — переопредели hashCode. Уточнят: что сломается в HashMap без hashCode. Вопрос №1.
Безопасность, кэш хеша, потокобезопасность; литералы — из пула. Следствие для практики: StringBuilder в циклах.
Интерфейс — контракт (+default-методы), абстрактный класс — общее состояние и часть реализации; наследование одно, интерфейсов много. Хотят критерий выбора, не определения.
Модификатор неизменяемости / блок «всегда выполнится» / устаревший хук GC (не использовать). Вопрос-скороговорка на внимательность.
Checked заставляет обрабатывать, unchecked — ошибки логики. Плюс: почему Spring оборачивает всё в unchecked; своё осмысленное мнение ценится.
Бакеты по hashCode, коллизии — список → дерево (Java 8+), O(1) в среднем. Второй по частоте вопрос; готовьте рассказ на 90 секунд.
Массив vs узлы; доступ O(1) vs вставки по итератору. Сильный финал: «на практике почти всегда ArrayList — и вот почему (кэш-локальность)».
Хеш без порядка / отсортированный (compareTo, O(log n)) / порядок вставки. Уточнят: что нужно элементу TreeSet (Comparable/Comparator).
Промежуточные ленивы, терминальная запускает конвейер; flatMap разворачивает вложенные структуры. Классика: из List<List<String>> — плоский список.
Явный «может отсутствовать» вместо null; анти-паттерны: Optional в полях/параметрах, optional.get() без проверки. Хотят зрелость, не восторг.
Взаимное исключение + видимость vs только видимость. Проверка: почему volatile count++ всё равно гонка (составная операция) и чем лечить (AtomicInteger).
Пул вместо new Thread: управление ресурсами, submit → Future/CompletableFuture. Достаточно уверенного практического минимума для мидла.
Контейнер управляет зависимостями: конструкторная инъекция предпочтительна; scope singleton по умолчанию. Уточнят: почему field injection ругают.
Прокси вокруг бина: транзакция на границе публичного метода. Ловушки: self-invocation, private-методы, проглоченные исключения. Ловушки — то, что отличает практика.
Ленивая загрузка порождает запрос на каждую строку; лечение: fetch join, EntityGraph, батчинг. Пример из своего проекта — золото.
Контекст → проблема → варианты → решение → результат. Подготовьте историю с техническими деталями заранее — уточняющие вопросы будут.
Пришлите текст вакансии — бесплатно вернём вероятные вопросы по ней, риски и слабые темы. А в приложении SkillCue — тренировка ответов и подсказки прямо во время созвона.
Разобрать мою вакансию бесплатно