Признаюсь сразу: у меня есть любимый вопрос на собеседовании. Он простой, как табуретка. «Чем == отличается от equals()?»
Казалось бы, что тут сложного. Это знает любой, кто дошёл хотя бы до десятого уровня. Кандидат бодро отвечает: «== сравнивает ссылки, equals — содержимое». Отлично. А потом я показываю ему вот это:
Integer small1 = 127;Integer small2 = 127;Integer big1 = 128;Integer big2 = 128;boolean sameSmall = small1 == small2; // trueboolean sameBig = big1 == big2; // falseИ в комнате становится очень тихо.
Дело не в том, что кандидат плохой. Дело в том, что он выучил ответ, а не понял, как это работает. Java кеширует объекты Integer от −128 до 127, поэтому 127 — это один и тот же объект, а 128 — уже два разных. Человек, который понимает, объяснит это за десять секунд. Человек, который выучил, будет долго смотреть в экран.
Вот так и устроено собеседование на Java в 2026 году. Вопросы почти те же, что и пять лет назад. Изменилось другое: теперь почти всегда спрашивают «а почему?» — и по второму ответу сразу видно, выучено или понято.
Выйти на такое собеседование, просто вызубрив «топ-100 вопросов», — это как выйти на ринг против Майка Тайсона, посмотрев пару его боёв на YouTube. Технически ты на ринге. Но первый же уточняющий вопрос прилетит быстрее, чем успеешь сказать «а в туториале такого не было».
Давай разберёмся, что спрашивают сейчас, где спотыкаются чаще всего и как подготовиться так, чтобы уточняющие вопросы тебя радовали, а не пугали.
Что изменилось в собеседованиях на Java
Если совсем коротко: вопросы по основам Java почти не меняются, но в 2026 году к ним добавились современная Java (17, 21 и 25), Spring Boot 4 и новый формат — лайвкодинг, на котором иногда разрешают пользоваться AI.
Три главных изменения:
- Java 25 — текущая LTS. Она вышла в сентябре 2025 года, это первая версия с долгосрочной поддержкой после Java 21. На собеседованиях всё чаще спрашивают не только «что нового в Java 8», но и про records, sealed-классы, pattern matching и виртуальные потоки.
- Spring Boot 4. Вышел в ноябре 2025 года вместе со Spring Framework 7: переход на Jackson 3, аннотации JSpecify для null-безопасности, встроенное версионирование API. Если в вакансии стоит Spring, про новую мажорную версию могут спросить.
- AI на собеседовании. Некоторые компании уже разрешают кандидатам пользоваться AI на технических интервью, а Canva с 2025 года прямо требует этого от кандидатов в бэкенд, фронтенд и машинное обучение. Но многие компании по-прежнему запрещают. Правило простое: спроси у рекрутера заранее.
Как устроено собеседование
Обычно это не один разговор, а несколько этапов:
- Скрининг с рекрутером — мотивация, опыт, ожидания по зарплате. Кода нет, но адекватность проверяют.
- Технический скрининг — 30–45 минут быстрых вопросов по основам, чтобы не тратить время инженеров на тех, кто не дотягивает.
- Техническое интервью — 60–90 минут: Java Core, коллекции, многопоточность, Spring, базы данных и много «почему».
- Лайвкодинг или тестовое задание — решаешь задачу при интервьюере или дома.
- Финальная встреча — команда, процессы, как работаешь в конфликте и под дедлайном. Про HashMap здесь уже не спрашивают. Спрашивают, что ты будешь делать, если прод упадёт в пятницу в шесть вечера.
Джунов в основном спрашивают по основам. Чем выше грейд, тем меньше теории и тем больше разговора про реальный опыт: что приходилось делать, какие решения принимать и где случались ошибки.
Дальше — вопросы по темам. Это не полный список, а самые частые, с короткими ответами и ловушками, на которых спотыкаются. Подробный разбор сотен вопросов есть в нашей большой серии «Разбор вопросов и ответов с собеседований на Java-разработчика» — к ней мы ещё вернёмся.
Java Core: база, без которой дальше не пустят
Чем примитивы отличаются от ссылочных типов? В переменной примитивного типа лежит само число или символ, а в ссылочной — адрес объекта, который живёт в куче. Отсюда классический вопрос с подвохом про Integer, с которого мы начали.
Почему String неизменяемый? Он неизменяемый, как мнение тимлида о табах и пробелах. А если серьёзно — ради безопасности, кеширования хеш-кода и пула строк: одну и ту же строку могут безопасно использовать много частей программы одновременно. Если нужно много раз склеивать строки в цикле — бери StringBuilder, иначе на каждой итерации будет создаваться новый объект.
Как связаны equals() и hashCode()? Правило одно: одинаковые по equals() объекты обязаны возвращать одинаковый hashCode(). А вот одинаковый hashCode() у разных объектов вполне допустим — это обычная коллизия. Переопределить equals() и забыть про hashCode() — верный способ получить объекты, которые HashMap «не находит», хотя они там лежат.
Объекты в Java передаются по ссылке или по значению? Любимый вопрос, на котором путаются даже уверенные мидлы. Если хочется блеснуть, скажи так: «Java всегда передаёт по значению, просто иногда это значение — ссылка». Звучит как восточная мудрость, а работает безотказно. Поэтому метод способен поменять поля переданного объекта, но не способен подменить сам объект в переменной снаружи.
Что вернёт этот метод?
static String pick() { try { return "try"; } finally { return "finally"; }}Ответ — "finally". Блок finally выполняется всегда, и его return перекрывает return из try. finally — как последний комментарий на код-ревью: последнее слово всегда за ним. На собеседовании этот код показывают не для того, чтобы так писали, а чтобы проверить, понимаешь ли ты порядок выполнения. А правильный ответ на «стоит ли так писать?» — нет, никогда.
Исключения: что ломается и кто за это отвечает
Вопросы про исключения кажутся скучными ровно до тех пор, пока прод не упал из-за проглоченного catch.
- Checked и unchecked: в чём разница? Про checked компилятор заставляет либо обработать, либо объявить в throws: например, IOException, когда работаешь с файлом. Unchecked, наследники RuntimeException, — обычно ошибки в самом коде вроде NullPointerException или IllegalArgumentException, и обрабатывать их компилятор не требует. Хороший ответ на собеседовании добавит: checked — для ситуаций, из которых программа может разумно выйти, unchecked — для багов, которые надо чинить, а не ловить.
- Что делает try-with-resources? Всё, что объявлено в скобках после try и реализует AutoCloseable, закроется автоматически, даже если внутри вылетит исключение:
try (var reader = Files.newBufferedReader(Path.of("orders.csv"))) { return reader.readLine();}Никаких finally с ручным close() и вложенных try внутри finally — как это было до Java 7.
- Можно ли перехватывать OutOfMemoryError? Технически можно: это наследник Throwable. Но OutOfMemoryError — это Error, а не Exception, то есть сигнал о проблеме, с которой программа обычно не может нормально справиться. Ловить его, чтобы «продолжить работу», — всё равно что на тонущем корабле аккуратно переставлять шезлонги. Единственный разумный вариант — записать в лог и аккуратно завершиться.
ООП: не определения, а примеры
Тут главная ошибка — отвечать определениями из учебника. «Инкапсуляция — это сокрытие данных». Спасибо, а где это пригодилось в твоём коде?
- Абстрактный класс или интерфейс? Интерфейс описывает, что объект умеет, и класс может реализовать много интерфейсов. Абстрактный класс — общая основа с состоянием и частичной реализацией, и наследоваться можно только от одного. С Java 8 в интерфейсах есть default-методы, поэтому граница стала тоньше — и об этом любят спросить.
- Перегрузка и переопределение. Перегрузка — методы с одним именем и разными параметрами, выбор на этапе компиляции. Переопределение — новая реализация метода родителя в наследнике, выбор во время выполнения.
- Как сделать класс неизменяемым? Поля private final, нет сеттеров, класс final или с закрытым конструктором, а изменяемые объекты внутри — копировать при получении и при отдаче. Или просто взять record, о нём ниже.
Коллекции: HashMap спросят почти наверняка
Если по коллекциям тебя спросят только один вопрос, это будет HashMap. Если два — второй тоже будет про HashMap.
Как устроен HashMap? Внутри массив «корзин». По hashCode() ключа выбирается корзина, а внутри неё элементы хранятся списком. Если в одной корзине их становится больше восьми (а сам массив уже не меньше 64 корзин), список превращается в красно-чёрное дерево, чтобы поиск не деградировал. Когда массив заполнен на 75% — это load factor по умолчанию, — он увеличивается вдвое и все элементы перераспределяются.
А теперь подвох:
Map<List<Integer>, String> map = new HashMap<>();List<Integer> key = new ArrayList<>(List.of(1));map.put(key, "value");key.add(2);String found = map.get(key); // nullМы изменили ключ после того, как положили его в карту. Его hashCode() изменился, HashMap ищет его в другой корзине и не находит. Запись при этом осталась в карте, просто достать её по этому ключу уже не получится. Отсюда золотое правило: ключи HashMap должны быть неизменяемыми.
Ещё частые вопросы:
- ArrayList или LinkedList? В реальном коде почти всегда ArrayList: доступ по индексу мгновенный, а данные лежат в памяти плотно. LinkedList выигрывает только в редких сценариях с частыми вставками в середину через итератор. Его все знают по учебникам, а в продакшене видели единицы — примерно как снежного человека.
- ConcurrentHashMap или Collections.synchronizedMap()? Обе потокобезопасные, но synchronizedMap блокирует всю карту целиком, а ConcurrentHashMap позволяет многим потокам работать с ней параллельно.
- Откуда берётся ConcurrentModificationException? От изменения коллекции во время обхода for-each. Удалять элементы при обходе нужно через итератор или removeIf().
Stream API: код в одну строку, вопросы — в три
Стримы любят и на собеседованиях, и в реальном коде. А ещё в них очень легко написать что-то красивое и неправильное.
- Почему стрим «ничего не делает»? Операции вроде filter, map и sorted — промежуточные: они возвращают новый стрим и сами по себе ничего не запускают. Стрим ленивый: работа начинается только на терминальной операции — collect, count, forEach. До неё ни один элемент не тронут. Отсюда подвох: если написать стрим с map и забыть терминальную операцию, код внутри map не выполнится ни разу. Стрим без терминальной операции — как список дел на понедельник: составлен красиво, но ничего не происходит.
- map() или flatMap()? map — один элемент на входе, один на выходе. flatMap — из каждого элемента получается целый стрим, а потом все они сливаются в общий поток. Самый частый пример — «расплющить» список списков:
List<List<String>> teams = List.of( List.of("Аня", "Борис"), List.of("Вика"));List<String> people = teams.stream() .flatMap(List::stream) .toList(); // [Аня, Борис, Вика]- Можно ли использовать стрим дважды? Нет. После терминальной операции стрим закрыт, и повторный вызов бросит IllegalStateException. Нужен ещё раз — создай новый.
- Optional: где его портят? Optional честно предупреждает: значения может не быть. Испортить его проще всего вызовом get() вслепую — это тот же NullPointerException, только в очках и с накладными усами. Второй способ — делать Optional полем класса или параметром метода: он задуман как тип возвращаемого значения. Правильно — orElse, orElseThrow, map и ifPresent.
- Что такое функциональный интерфейс? Интерфейс ровно с одним абстрактным методом, например Runnable, Comparator или Function. Именно такие интерфейсы можно реализовать лямбдой. Аннотация @FunctionalInterface не обязательна, но попросит компилятор проверить, что метод действительно один.
Многопоточность: где сыплются мидлы
Здесь отсеивается больше всего кандидатов на мидла. Потому что многопоточность нельзя выучить по шпаргалке — её надо понять. Ну и немного бояться: это здоровое чувство.
- Что гарантирует volatile? Видимость изменений между потоками: запись в volatile-переменную одним потоком сразу видна другим. Но атомарности volatile не даёт: инкремент count++ — это чтение, сложение и запись, и два потока всё равно могут потерять чьё-то обновление.
- Что такое happens-before? Правило, которое гарантирует, что результаты одного действия видны другому. Например, всё, что поток сделал до освобождения монитора, увидит поток, который потом этот монитор захватит.
- Как возникает deadlock? Два потока захватывают одни и те же блокировки в разном порядке и вечно ждут друг друга. Как два очень вежливых человека в узком коридоре: «только после вас» — и так до конца рабочего дня. Лечится единым порядком захвата блокировок, а найти можно по дампу потоков.
- Runnable или Callable? Callable умеет возвращать результат и бросать проверяемые исключения. Запускают их обычно через ExecutorService, а не руками через new Thread().
Отдельная большая тема — 52 вопроса по Java Thread, которые мы когда-то собрали в одну статью.
Современная Java: что спрашивают в 2026
Это та часть, которой не было в собеседованиях пять лет назад, и поэтому именно она отличает кандидата, который следит за языком.
Что такое record? Компактный класс для неизменяемых данных:
record Point(int x, int y) {}Одна строка — и у тебя уже есть конструктор, геттеры x() и y(), equals(), hashCode() и toString(). Все поля final. Lombok в этот момент молча собирает вещи. Идеально подходит для DTO и тех самых ключей HashMap — если, конечно, внутри record не лежит изменяемый ArrayList: final защищает ссылку, а не содержимое списка.
Зачем нужны sealed-классы? Они явно перечисляют, кто может от них наследоваться. В связке с pattern matching в switch компилятор знает все возможные варианты и предупредит, если какой-то вариант остался без обработки.
Что такое виртуальные потоки? Лёгкие потоки, которые управляются JVM, а не операционной системой. Десять тысяч таких потоков — обычное дело, можно и сотни тысяч:
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { for (int i = 0; i < 10_000; i++) { executor.submit(() -> callSlowService()); }}Хороший вопрос на собеседовании звучит так: когда виртуальные потоки не помогут? Ответ: когда задача упирается в процессор, а не в ожидание. Виртуальные потоки хороши там, где код много ждёт — сеть, база, внешние сервисы. А вычислительную задачу они быстрее не сделают — как новое кресло не ускорит написание кода.
Бонус для мидла: раньше виртуальный поток «прилипал» к системному, если блокировался внутри synchronized, и вся выгода пропадала. В Java 24 это исправили, но о такой ловушке знать полезно — проекты на Java 21 никуда не делись.
Что нового в Java 25? Перечислять все изменения не нужно, но пару стоит знать. Например, теперь можно написать программу без объявления класса и с упрощённым методом main — это сделали для тех, кто только начинает учить язык. А конструкторы теперь могут выполнять код до вызова super(), например проверять аргументы.
JVM и память
- Из каких областей состоит память JVM? Куча, где живут объекты, стек каждого потока с локальными переменными и вызовами методов, и метаспейс, где хранятся описания классов.
- Как работает сборщик мусора? Удаляет объекты, на которые больше нет ссылок из «живых» частей программы. Он как уборщик в офисе: выбрасывает только то, на что никто не претендует. Кружку с запиской «не трогать» он не тронет, даже если она стоит там три года. Большинство объектов живёт очень недолго, поэтому куча делится на поколения: молодые объекты собираются часто и быстро, старые — реже.
- Бывают ли в Java утечки памяти? Да. Сборщик мусора не удалит объект, на который кто-то всё ещё ссылается. Классика — статическая коллекция, в которую только добавляют и никогда не удаляют. Та самая кружка с запиской, только на гигабайт. Или тот самый HashMap с изменённым ключом: записи остаются, а достать их уже нельзя.
Spring и базы данных
Если в вакансии стоит Spring, а там он стоит почти всегда (иногда кажется, что и в вакансии баристы), готовься к этому блоку отдельно.
- IoC и DI: что это и почему внедрение через конструктор лучше? Spring сам создаёт объекты и передаёт их зависимости. Через конструктор лучше, потому что зависимости видны сразу, поля можно сделать final, а класс легко протестировать без Spring.
- Почему @Transactional не срабатывает? Классика: метод с @Transactional вызывают из другого метода того же класса. Транзакцией управляет прокси, а вызов внутри класса проходит мимо него — как сотрудник, который заходит в офис через чёрный ход и не отмечается на проходной. Это один из самых частых вопросов на мидла.
- Что такое проблема N+1? Загрузили список из 100 заказов одним запросом, а потом для каждого заказа отдельным запросом подтянули покупателя. Итого 101 запрос вместо одного-двух. База данных в этот момент тихо плачет. Лечится JOIN FETCH или EntityGraph.
- Какие бывают уровни изоляции транзакций? От READ UNCOMMITTED до SERIALIZABLE. Важно не только перечислить, но и объяснить, от каких аномалий защищает каждый: грязное чтение, неповторяющееся чтение, фантомное чтение.
- INNER JOIN или LEFT JOIN? Представь две таблицы: покупатели и заказы. INNER JOIN оставит только тех покупателей, у кого есть хотя бы один заказ, — остальные просто пропадут из результата. LEFT JOIN сохранит всех покупателей, а в колонках заказа у «пустых» будет NULL. Классический вопрос на понимание: как найти покупателей, у которых нет ни одного заказа? Ответ — LEFT JOIN и условие, что поле из таблицы заказов IS NULL.
- Зачем нужны индексы и почему нельзя повесить их на всё? Индекс ускоряет поиск, как оглавление в книге: базе не нужно читать всю таблицу. Но каждый индекс замедляет вставку и обновление, потому что его тоже надо поддерживать, и занимает место. Поэтому индексы создают под реальные запросы, а не на всякий случай. Индексы на всё — как выделить маркером весь учебник: выделено всё, значит, не выделено ничего.
Отдельно по базам данных у нас есть подробный разбор вопросов с собеседований по базам данных.
Лайвкодинг и AI: что изменилось
Лайвкодинг пугает сильнее всего. Решать задачу, пока на тебя смотрят, — тот ещё стресс: даже обычный цикл for вдруг начинает выглядеть подозрительно. Но вот секрет: интервьюеру почти всегда важнее, как ты думаешь, чем правильный ли получился ответ.
Что ценят на лайвкодинге:
- Говорить вслух. Молчащий кандидат — чёрный ящик. Кандидат, который рассуждает, показывает ход мысли, даже если запнулся.
- Уточнять условие. «Могут ли во входных данных быть null?», «Какой размер массива?» — это не тупость, а профессионализм.
- Начинать с простого решения. Сначала рабочее, потом оптимальное. Лучше рабочий перебор, чем красивая идея, которую не успели дописать.
Разбор задачи: как это выглядит вживую
Возьмём типичную задачу с лайвкодинга: найти первый символ в строке, который встречается ровно один раз. Для строки "swiss" ответ — "w".
Шаг 1. Уточни условие. Прежде чем писать код, задай пару вопросов. Что вернуть, если такого символа нет? Различаются ли большие и маленькие буквы? Может ли строка быть пустой? Интервьюер ответит, а заодно увидит, что ты думаешь о краевых случаях.
Шаг 2. Простое решение. Для каждого символа пробежать всю строку и посчитать, сколько раз он встречается. Работает, но это O(n²): на строке в миллион символов будет очень долго. Скажи это вслух — интервьюеру важно, что ты понимаешь цену решения.
Шаг 3. Оптимизация. Достаточно двух проходов: сначала посчитать все символы, потом найти первый с единицей. Чтобы не потерять порядок символов, подойдёт LinkedHashMap. А раз символа может и не быть — возвращаем Optional, как и договаривались в разделе про стримы:
static Optional<Character> firstUnique(String text) { Map<Character, Integer> counts = new LinkedHashMap<>(); for (char c : text.toCharArray()) { counts.merge(c, 1, Integer::sum); } for (Map.Entry<Character, Integer> entry : counts.entrySet()) { if (entry.getValue() == 1) { return Optional.of(entry.getKey()); } } return Optional.empty();}Теперь это O(n): каждый символ обрабатываем константное число раз.
Шаг 4. Проверь себя. Прогони в голове пару примеров: "swiss" — вернёт "w", "aabb" — пустой Optional, пустая строка — тоже пустой Optional. Если интервьюер спросит, почему именно LinkedHashMap, а не HashMap, у тебя уже есть ответ: обычный HashMap не помнит порядок вставки, и «первый» символ мог бы оказаться каким угодно.
А теперь бонус, который приятно удивит интервьюера: можно обойтись и обычным HashMap, если второй раз пройти не по карте, а по самой строке. Порядок тогда задаёт строка, а карта только хранит счётчики. Два рабочих варианта и понятный выбор между ними — именно то, что хотят увидеть на лайвкодинге.
Вот и весь секрет лайвкодинга. Не блестящее решение с первой попытки, а понятный путь: уточнить условие, решить просто, оценить сложность, улучшить, проверить.
А можно ли пользоваться AI? Зависит от компании, а иногда и от этапа. Если разрешено, интервьюер обычно смотрит не на то, что сгенерировала нейросеть, а на то, как ты её используешь: что просишь, как проверяешь результат, замечаешь ли ошибки. В Canva, например, прямо говорят: важно не то, что AI написал за кандидата, а умение прочитать сгенерированный код, понять его и улучшить — и объяснить каждое техническое решение. Если ты не можешь объяснить, что делает код, AI тебе не помог, а подставил. Это как прийти на экзамен со шпаргалкой, написанной на незнакомом языке.
Честно говоря, это самый сильный аргумент за фундамент, который я знаю. Нейросеть напишет тебе HashMap с изменяемым ключом за секунду. А заметить, что так нельзя, сможешь только ты.
Шпаргалка: что на самом деле проверяют
Каждый вопрос на собеседовании — это вопрос с двойным дном. Вот что стоит за самыми частыми:
| Вопрос | Что на самом деле проверяют | Грейд |
| Чем == отличается от equals()? | Понимаешь ли ты разницу между объектом и ссылкой на него | Junior |
| Как связаны equals() и hashCode()? | Сможешь ли ты написать класс, который не сломает HashMap | Junior |
| Как устроен HashMap? | Знаешь ли ты, что происходит под капотом, а не только API | Junior |
| Checked или unchecked? | Как ты будешь обрабатывать ошибки в реальном коде | Junior |
| map() или flatMap()? | Читаешь ли ты стримы, а не просто копируешь их | Junior |
| Что гарантирует volatile? | Понимаешь ли ты модель памяти или знаешь только слово | Middle |
| Почему @Transactional не сработал? | Понимаешь ли ты, как Spring работает через прокси | Middle |
| Что такое проблема N+1? | Следишь ли ты за тем, что ORM делает с базой | Middle |
| Когда виртуальные потоки не помогут? | Следишь ли ты за языком и понимаешь ли его границы | Middle |
| Задача на лайвкодинге | Как ты думаешь, уточняешь и проверяешь себя | Все |
Как подготовиться за три недели
Неделя 1 — основы. Java Core, ООП, исключения, коллекции и Stream API. Не читай ответы — пиши код. Положи изменяемый ключ в HashMap и посмотри, что будет. Сломай equals() и hashCode() и найди, где это вылезет.
Неделя 2 — многопоточность и современная Java. Напиши программу с deadlock и найди его по дампу потоков. Перепиши пару классов на record. Запусти десять тысяч виртуальных потоков и посмотри, как это работает.
Неделя 3 — Spring, базы данных и практика. Собери маленькое приложение на Spring Boot с базой данных, поймай у себя проблему N+1 и почини её. И обязательно проведи пару пробных собеседований — с другом, ментором или хотя бы вслух перед зеркалом.
И главное правило: не заучивай ответы. Каждый вопрос из этой статьи можно проверить кодом за пять минут. Проверенное руками запоминается навсегда, выученное — до первого «а почему?».
И тогда в комнате снова станет тихо. Только теперь — потому, что интервьюеру нечего добавить.
Где практиковаться
На курсе Java в JavaRush почти каждая тема из этой статьи — от коллекций и исключений до многопоточности — отрабатывается на задачах с мгновенной проверкой. Ошибка в equals() и hashCode() всплывает сразу, а не на собеседовании.
А если хочется пройти путь до первого оффера с ментором, ревью кода и проектами в портфолио, есть Java University: там есть и карьерный центр, где помогают с резюме и готовят к собеседованиям.
Ну а если хочется ещё больше вопросов с подробными ответами — открывай нашу серию «Разбор вопросов и ответов с собеседований на Java-разработчика» и большой гайд по подготовке к первым собеседованиям на Java Junior. Там хватит на много вечеров.
Частые вопросы
Какие вопросы задают на собеседовании Java-разработчику в 2026 году? Основа не меняется: Java Core, ООП, исключения, коллекции, Stream API, многопоточность, JVM, Spring и базы данных. В 2026 году к ним добавились вопросы по современной Java — records, sealed-классы, pattern matching, виртуальные потоки и изменения в Java 25 — а также по Spring Boot 4.
Что спрашивают на собеседовании Java Junior? В основном базу: чем == отличается от equals(), как связаны equals() и hashCode(), почему String неизменяемый, как устроен HashMap, чем ArrayList отличается от LinkedList, разницу между checked и unchecked исключениями, try-with-resources и разницу между map() и flatMap() в Stream API. Важно не только знать ответ, но и объяснить, почему это так.
Какие вопросы задают мидлу на собеседовании по Java? Многопоточность (volatile, happens-before, deadlock, ExecutorService), устройство JVM и сборщика мусора, Spring (DI, @Transactional и его ловушки), Hibernate (проблема N+1, ленивая загрузка) и уровни изоляции транзакций. Плюс много вопросов о реальном опыте.
Можно ли пользоваться AI на собеседовании по Java? Зависит от компании и даже от этапа. Некоторые компании разрешают или требуют AI на техническом интервью, многие по-прежнему запрещают. Уточняй у рекрутера заранее. Если AI разрешён, проверяют, умеешь ли ты объяснить и проверить сгенерированный код.
Какая версия Java сейчас актуальна для собеседований? Текущая LTS-версия — Java 25, вышедшая в сентябре 2025 года. При этом многие компании ещё работают на Java 17 и 21, поэтому полезно знать, что появилось в каждой из этих версий.
Какие задачи дают на лайвкодинге по Java? Обычно небольшие алгоритмические задачи на строки, массивы и коллекции: найти первый неповторяющийся символ, дубликаты в массиве, проверить палиндром, сгруппировать данные через HashMap. Интервьюер смотрит не только на результат, но и на то, как ты уточняешь условие, оцениваешь сложность и проверяешь краевые случаи.
Как быстро подготовиться к собеседованию по Java? За три недели можно хорошо освежить базу: первая неделя — Java Core и коллекции, вторая — многопоточность и современная Java, третья — Spring, базы данных и пробные собеседования. Главное — проверять каждый ответ кодом, а не заучивать.