Перейти к основному содержимому

Вопросы на собеседовании

Вопросы на собеседовании Java-разработчика

25 вопросов на собеседовании Java-разработчика: JVM и сборка мусора, коллекции, многопоточность, Spring и транзакции, Hibernate и N+1, Stream API.

Мои ответы на эти вопросы — за 30 секунд

Без резюме: опыт и последнее место работы. 25 вопросов в ваших словах, первые три — бесплатно.

Типовые вопросы и подсказки к ответам

Откройте подсказку под вопросом — и тут же проговорите ответ: разбор ИИ придёт в мини-собеседовании.

HR-вопрос

Вопрос 1Для всех уровней

Почему вы хотите перейти на новую позицию Java-разработчика?

Как отвечать ▾

Как отвечать: Свяжите мотивацию с ростом, задачами и стеком компании, избегая негатива о текущем работодателе и ответа только про деньги.

Пример сильного ответа

На текущей позиции моя зона ответственности — поддержка большого монолита, и новых задач по проектированию почти не появляется: примерно 80% времени уходит на правки и разбор инцидентов. Хочу расти как инженер: проектировать сервисы, работать с высокой нагрузкой, влиять на архитектурные решения. На новой позиции вижу именно такую работу — микросервисы, код-ревью, наставничество. За последний год мне удалось перевести два модуля на актуальный стек и сократить время отклика сервиса на 30%, поэтому пользу приношу с первых недель.

Вопрос 2Для всех уровней

Как вы поддерживаете свои знания Java актуальными и что изучаете сейчас?

Как отвечать ▾

Как отвечать: Назовите конкретные источники и темы: новые версии JDK, виртуальные потоки, изменения в Spring Boot — и как применяете это в работе.

Пример сильного ответа

У меня есть система: каждую неделю выделяю 4–5 часов на учёбу. Читаю релиз-ноты и обсуждения новых возможностей JDK, разбираю, что меняется в языке и в JVM, смотрю доклады с профильных конференций. Обязательно закрепляю практикой: сейчас пишу небольшой сервис на актуальной версии Java, чтобы попробовать новые возможности языка и виртуальные потоки под реальной нагрузкой. Плюс внутренние митапы: раз в месяц делаю доклад для команды из шести человек. Такой формат даёт и глубину, и умение объяснять решения коллегам.

Бесплатно, без регистрации

Мини-собеседование: Java-разработчик

Прочитать вопросы мало — на интервью придётся говорить. Ответьте на один вопрос своими словами, 2–3 предложений хватит, и ИИ разберёт ответ по четырём критериям: структура, конкретика, релевантность, убедительность.

123
HR-вопросДля всех уровней

Почему вы хотите перейти на новую позицию Java-разработчика?

2–3 предложения достаточно · ещё 20 симв.

Технический вопрос

Вопрос 1Для всех уровней

Как устроена сборка мусора в JVM и какие сборщики вы знаете?

Как отвечать ▾

Как отвечать: Расскажите про поколения объектов, stop-the-world паузы и различия G1, ZGC и Parallel GC, приведите пример, когда выбирали сборщик под сервис.

Пример сильного ответа

JVM делит кучу на поколения: молодое и старое. Новые объекты попадают в Eden, пережившие сборки переезжают в Survivor, затем в Old. Отсюда два типа сборок: быстрые minor и более дорогие major. Сборщик выбираю под задачу: Serial и Parallel — когда важен throughput, G1 — компромисс по паузам, ZGC и Shenandoah — когда нужны минимальные паузы на больших кучах. Смотрю GC-логи, долю времени в сборках и длину пауз. На одном проекте после смены сборщика и настройки размеров поколений паузы упали с секунды до 100–150 мс, и это сняло жалобы на таймауты.

Вопрос 2Middle

Чем Heap отличается от Stack и когда возникают OutOfMemoryError и StackOverflowError?

Как отвечать ▾

Как отвечать: Разведите хранение объектов и кадров вызовов, объясните типичные причины: утечки через статические коллекции и неограниченная рекурсия.

Пример сильного ответа

Stack — это память потока: там фреймы вызовов и локальные переменные, размер небольшой, работа по принципу LIFO. Heap — общая память для объектов, ей управляет сборщик мусора. StackOverflowError возникает при слишком глубокой или бесконечной рекурсии: стек потока переполняется. OutOfMemoryError — когда в куче не хватает места под новые объекты, например из-за утечки через статическую коллекцию или слишком большого объёма данных в памяти. Мне приходилось искать утечку по дампу кучи: причина оказалась в статической коллекции, которая росла и не очищалась; после правки потребление памяти упало примерно на 40%.

Вопрос 3Для всех уровней

Как устроена HashMap и почему критично соблюдать контракт equals и hashCode?

Как отвечать ▾

Как отвечать: Объясните бакеты, хеширование, разрешение коллизий и покажите на примере, что ломается, если переопределить equals без hashCode.

Пример сильного ответа

HashMap внутри — массив корзин. Хеш ключа определяет индекс, коллизии разрешаются списком, а при большой длине — красно-чёрным деревом. При превышении порога по заполнению происходит resize. Контракт equals и hashCode критичен: если равные объекты дают разные хеши, ключ не найдётся, появятся дубликаты и утечки. В одном проекте кэш на 150 тысяч записей после исправления hashCode: время поиска сократилось с линейного до константного, а потребление памяти снизилось примерно на 20%. Поэтому всегда проверяю контракт в тестах.

Вопрос 4Для всех уровней

Чем ArrayList отличается от LinkedList и как вы выбираете коллекцию под задачу?

Как отвечать ▾

Как отвечать: Сравните сложность доступа, вставки и удаления, потребление памяти и скажите, почему на практике почти всегда выбирают ArrayList.

Пример сильного ответа

Выбор начинается с профиля доступа. ArrayList — это массив: доступ по индексу очень быстрый, а вставка или удаление в середине требует сдвига элементов. LinkedList — двусвязный список: вставка по уже найденному узлу дешёвая, но доступ по индексу линейный, на каждый элемент уходит лишняя память, а из-за разбросанности узлов страдает локальность кэша. На практике LinkedList проигрывает почти всегда. Мне приходилось заменять его на ArrayList на горячем пути обработки заказов, и разбор пакета из двухсот тысяч записей ускорился примерно на треть. Очереди и стеки я строю на ArrayDeque.

Вопрос 5Для всех уровней

Почему String неизменяем и какие последствия это имеет?

Как отвечать ▾

Как отвечать: Упомяните пул строк, безопасность, хеширование в ключах коллекций и когда вместо конкатенации нужен StringBuilder.

Пример сильного ответа

String неизменяем, и это даёт сразу несколько выгод. Объект безопасно передавать между потоками без синхронизации, использовать как ключ в HashMap — хеш считается один раз и кэшируется, — а также безопасно отдавать в API, где важна целостность значения. Благодаря неизменяемости работает и пул строк, поэтому одинаковые литералы переиспользуются. Обратная сторона — каждая модификация создаёт новый объект. В цикле конкатенация через плюс превращается в генератор мусора. Мне приходилось переписывать сборку большого отчёта на StringBuilder, и потребление памяти на этом участке снизилось примерно на сорок процентов, а паузы сборщика мусора стали заметно короче.

Вопрос 6Middle

Что такое JIT-компиляция и как она влияет на производительность Java-приложения?

Как отвечать ▾

Как отвечать: Расскажите про разогрев JVM, горячие участки кода и почему замеры производительности без прогрева некорректны.

Пример сильного ответа

JIT — это компиляция байт-кода в машинный код прямо во время работы приложения. Сначала код исполняет интерпретатор, а горячие методы, по данным профилирования, компилируются и оптимизируются: инлайнинг, устранение мёртвого кода, escape-анализ. Если предположения перестают выполняться, происходит деоптимизация. Для практики важно, что приложение разогревается: первые запросы заметно медленнее. Мне приходилось видеть, как сервис на старте показывал задержки в разы выше, чем через несколько минут работы. Поэтому нагрузочные замеры я делаю только на прогретой JVM, и после прогрева время ответа на типовой запрос падало примерно вдвое.

Вопрос 7Middle

Чем synchronized отличается от ReentrantLock и когда вы выбираете каждый вариант?

Как отвечать ▾

Как отвечать: Сравните простоту монитора с возможностями tryLock, прерываемого ожидания и честных блокировок, приведите пример из практики.

Пример сильного ответа

synchronized — это встроенный монитор: кода меньше, блокировка освобождается автоматически, компилятор такие блоки хорошо оптимизирует, поэтому по умолчанию я выбираю именно его. ReentrantLock нужен, когда требуется больше контроля: попытка захвата с таймаутом, прерываемое ожидание, честная очередь или несколько Condition на одной блокировке. В одном сервисе внешний вызов иногда деградировал, и потоки надолго зависали на мониторе. Перевод критической секции на tryLock с таймаутом в полсекунды вернул управляемость: зависаний больше не было, а пропускная способность выросла примерно на двадцать процентов.

Вопрос 8Для всех уровней

Что гарантирует ключевое слово volatile и каких гарантий оно не даёт?

Как отвечать ▾

Как отвечать: Объясните видимость изменений между потоками и happens-before, подчеркните, что составные операции вроде инкремента volatile не защищает.

Пример сильного ответа

volatile гарантирует видимость записи для других потоков и запрещает переупорядочивание операций вокруг обращения к переменной. Но атомарности он не даёт: составные операции вроде инкремента остаются небезопасными, взаимного исключения тоже нет, поэтому две записи могут перекрыться. Отсюда и выбор: volatile уместен для флага остановки, для ссылки на неизменяемый объект, который публикуется целиком. Для счётчиков и накопителей я беру атомарные классы или блокировку. Мне приходилось разбирать случай, когда флаг остановки без volatile не был виден, и сервис останавливался по таймауту; после правки остановка укладывалась в две секунды.

Вопрос 9Middle

Как работает ConcurrentHashMap и почему он быстрее синхронизированной обёртки над HashMap?

Как отвечать ▾

Как отвечать: Опишите сегментирование и блокировку на уровне бакетов, атомарные операции вроде computeIfAbsent и отсутствие глобальной блокировки на чтение.

Пример сильного ответа

В основе ConcurrentHashMap — идея блокировать не всю коллекцию, а отдельные бакеты. При чтении значение берётся из volatile-поля без блокировки, запись идёт через CAS, и только при коллизии поток синхронизируется на первом узле бакета. Поэтому параллельные читатели и писатели в разные бакеты почти не мешают друг другу, тогда как синхронизированная обёртка держит один монитор на весь HashMap и выстраивает все операции в очередь. В одном из проектов кэш на 200 000 записей под нагрузкой 3000 RPS работал через обёртку, а перевод на ConcurrentHashMap дал снижение времени ответа p99 примерно в десять раз.

Вопрос 10Middle

Что такое deadlock и как вы его находите и предотвращаете?

Как отвечать ▾

Как отвечать: Назовите условия взаимной блокировки, упорядочивание захвата локов, таймауты и диагностику через thread dump или jstack.

Пример сильного ответа

Deadlock — это взаимная блокировка, когда потоки держат ресурсы и ждут те, что заняты друг другом. Для поиска снимаю thread dump через jstack или профилировщик, смотрю блоки «waiting to lock», строю граф ожиданий и ищу цикл; дополнительно помогают алерты по времени ответа и логи с таймаутами. Профилактика проще: единый порядок захвата блокировок, tryLock с таймаутом вместо бесконечного ожидания, короткие критические секции, отказ от вложенных чужих мониторов. В сервисе с интеграциями такие зависания случались примерно раз в месяц; после введения общего порядка захвата и таймаутов подобных инцидентов за полгода не было.

Вопрос 11Middle

Как вы управляете пулами потоков через ExecutorService и какие очереди выбираете?

Как отвечать ▾

Как отвечать: Расскажите про параметры ThreadPoolExecutor, риски безразмерных очередей, политику отказов и почему newFixedThreadPool под нагрузкой опасен.

Пример сильного ответа

Пул настраиваю явно через ThreadPoolExecutor: отдельный пул для расчётных задач и отдельный для блокирующих вызовов, чтобы медленный ввод-вывод не съедал потоки вычислений. Размер первого привязываю к числу ядер, второго беру заметно больше, потому что потоки там в основном ждут. Очередь выбираю по смыслу: ArrayBlockingQueue с ограничением даёт backpressure, SynchronousQueue — прямой хендофф, а неограниченную не беру, она копит задачи до падения по памяти. Плюс политика отказа, понятные имена потоков, метрики по размеру очереди и activeCount, корректное завершение через shutdown и awaitTermination. Типовая конфигурация: 8 потоков под расчёты и 32 под интеграции с очередью на 200 задач.

Вопрос 12Middle

Чем промежуточные операции Stream API отличаются от терминальных и где подводные камни parallelStream?

Как отвечать ▾

Как отвечать: Объясните ленивость конвейера, short-circuiting, общий ForkJoinPool и случаи, когда parallelStream ухудшает производительность.

Пример сильного ответа

Промежуточные операции ленивы: они только описывают конвейер и возвращают новый Stream, а работа запускается терминальной — collect, reduce, forEach. Отсюда правило: один терминальный вызов на поток и никакого повторного использования. С parallelStream нужна осторожность: по умолчанию это общий ForkJoinPool с ограниченным числом потоков, поэтому блокирующие вызовы и ввод-вывод там вредят всему приложению, а разбиение и слияние дают накладные расходы. Есть и неочевидности с порядком, состоянием и побочными эффектами. В расчёте по миллиону записей параллельный вариант с общим состоянием дал ускорение около 1,3 раза, а после переписывания на чистый reduce — почти четырёхкратное.

Вопрос 13Для всех уровней

Что такое IoC и внедрение зависимостей в Spring и зачем это нужно?

Как отвечать ▾

Как отвечать: Расскажите про контейнер бинов, внедрение через конструктор, слабую связанность и тестируемость, избегая пересказа документации.

Пример сильного ответа

IoC — это передача контейнеру управления созданием объектов и их связями: класс не ищет зависимости самостоятельно, а объявляет их, а Spring решает, что и когда создать. Внедрение зависимостей через конструктор делает зависимости явными, объект всегда в согласованном состоянии, его легко подменить в тестах на мок. Появляется единая точка конфигурации, управление жизненным циклом и областями видимости, слабая связанность слоёв. В проекте с несколькими десятками бинов это позволяло менять реализацию хранилища или клиента внешней системы одной конфигурацией, без правок в бизнес-логике, и покрывать сервисы модульными тестами без запуска контекста.

Вопрос 14Middle

Как работает @Transactional и в каких случаях транзакция не откатится?

Как отвечать ▾

Как отвечать: Упомяните прокси-механизм, самовызов метода, checked-исключения, private-методы и распространение транзакций.

Пример сильного ответа

@Transactional работает через прокси: Spring открывает транзакцию до вызова метода и коммитит или откатывает после. По умолчанию откат идёт только по RuntimeException и Error, поэтому проверяемое исключение без rollbackFor доведёт дело до коммита. Ещё три ловушки: самовызов внутри того же бина идёт мимо прокси, исключение поймано внутри метода и не проброшено, вложенная транзакция помечает внешнюю как rollback-only. В проекте по сверке платежей такие случаи встречались на возвратах: помогли rollbackFor и вынос вызовов в отдельный сервис. Количество «зависших» операций снизилось примерно на 90% — с нескольких сотен до десятков в месяц.

Вопрос 15Middle

Что такое проблема N+1 в Hibernate и как вы её диагностируете и устраняете?

Как отвечать ▾

Как отвечать: Опишите включение логирования SQL, подсчёт запросов, решения через join fetch, EntityGraph и пакетную загрузку.

Пример сильного ответа

N+1 — когда один запрос загружает список сущностей, а потом для каждой из них Hibernate шлёт отдельный запрос за связью: вместо пары запросов получается N+1. Диагностирую по логам SQL: включаю вывод запросов и смотрю, повторяется ли один и тот же select с разными параметрами; в тестах помогает статистика Hibernate и профилировщик. Устраняю через join fetch или @EntityGraph в JPQL, а если нужна пагинация по коллекции — через DTO-проекцию или @BatchSize. На списке заказов вместо 300 запросов стало 2, страница ускорилась с 4 секунд до 250 миллисекунд.

Вопрос 16Middle

Что такое LazyInitializationException и как правильно работать с ленивой загрузкой?

Как отвечать ▾

Как отвечать: Объясните границы сессии и транзакции, загрузку связей в сервисном слое и почему open-session-in-view в production — спорное решение.

Пример сильного ответа

LazyInitializationException возникает, когда код обращается к ленивой связи после закрытия сессии или выхода из транзакции: прокси уже не может сходить в базу. Чаще всего это всплывает при сериализации сущности в контроллере, в toString или equals. Правильный путь — загружать нужные данные внутри транзакции: join fetch, @EntityGraph или DTO-проекция, а не открытая на весь запрос сессия. В сервисе отчётности такая ошибка встречалась в экспорте; после перехода на DTO с выборкой нужных полей инциденты прекратились, а экспорт ускорился примерно на 30%.

Вопрос 17Middle

Какие scope бинов существуют в Spring и где реально применяются prototype и request?

Как отвечать ▾

Как отвечать: Назовите singleton, prototype, request, session, приведите примеры использования и объясните риск внедрения prototype-бина в singleton.

Пример сильного ответа

Основной scope — singleton, один бин на контекст. Дальше prototype — новый экземпляр на каждое получение, request и session — на HTTP-запрос и на сессию пользователя, есть ещё application и websocket. Prototype применяется для состояния и не потокобезопасных объектов: парсеры, билдеры, тяжёлые конвертеры; важная деталь — в singleton его нельзя просто заинжектить, нужен ObjectProvider или @Lookup. Request реально нужен для данных конкретного запроса: идентификатор корреляции, арендатор, пользовательский контекст, кэш в рамках запроса. В одном сервисе так хранился контекст арендатора, и ручная передача параметра через несколько десятков методов исчезла.

Эти вопросы задают всем. По вашему резюме спросят другое. Перерывы, переходы, цифры — покажем 5 вопросов, которые зададут именно вам.

Вопросы по моему резюме

Кейс

Вопрос 1Middle

Кейс: после перехода на Spring Data JPA страница списка стала открываться 10 секунд. Как ищете причину?

Как отвечать ▾

Как отвечать: Пройдите путь: включить SQL-логи, обнаружить N+1, проверить план запроса и индексы, применить fetch join и замерить результат.

Пример сильного ответа

Сначала воспроизвожу и измеряю: включаю логи SQL и статистику, смотрю, сколько запросов уходит на один рендер страницы и какие из них самые долгие. Дальше проверяю типовые причины после перехода на Spring Data: вместо одного запроса появились сотни из-за N+1, ленивые связи подгружаются по одной, пагинация считается в памяти, нет индекса под фильтр. Помогают join fetch или @EntityGraph, DTO-проекция, батчинг и индекс. В похожем случае страница открывалась 10 секунд: 240 запросов превратились в 3, отклик стал около 300 миллисекунд.

Вопрос 2Senior

Кейс: сервис под нагрузкой периодически замирает на несколько секунд. Ваши действия?

Как отвечать ▾

Как отвечать: Начните с метрик GC и логов пауз, снимите heap dump, проверьте утечки и размер кучи, затем предложите тюнинг или смену сборщика.

Пример сильного ответа

Первым делом смотрю метрики и логи: когда именно замирания — по расписанию, на пиках трафика или после релиза. Дальше снимаю несколько thread dump с интервалом и подключаю профайлер, обычно картина проясняется быстро. Частые причины: длинные паузы сборщика мусора, исчерпание пула потоков или пула соединений, блокировки на общем ресурсе, вызовы внешних сервисов без таймаутов. В одном случае помогло вернуть таймауты и ограничить параллелизм: время ответа на пике снизилось примерно на 40%, а секундные замирания исчезли. После фикса всегда добавляю метрику или алерт, чтобы проблема ловилась заранее, а не от пользователей.

Вопрос 3Middle

Кейс: при сбое сети клиент ретраит запрос, и денежная операция иногда выполняется дважды. Как защититься?

Как отвечать ▾

Как отвечать: Предложите идемпотентный ключ, уникальные ограничения в БД, корректные границы транзакции и возврат прежнего результата при повторе.

Пример сильного ответа

Основа здесь — идемпотентность. Клиент передаёт уникальный ключ операции, и на его основе в базе стоит уникальное ограничение: повтор с тем же ключом не создаёт вторую операцию, а возвращает результат первой. Обработка идёт в одной транзакции, поэтому результат либо есть целиком, либо его нет. На стороне клиента — повторные попытки с нарастающей задержкой и случайным разбросом, чтобы не добивать сервис. Дополнительно ставлю проверку на дубли в мониторинге. После такой схемы повторные списания, случавшиеся несколько раз в месяц, прекратились, а обращения в поддержку по этой теме упали примерно вдвое.

Поведенческий вопрос

Вопрос 1Для всех уровней

Расскажите о самом сложном баге, который вы нашли в production.

Как отвечать ▾

Как отвечать: Ответьте по STAR: контекст, диагностика, ваши действия, результат и что изменили в процессах, чтобы баг не повторился.

Пример сильного ответа

Самый памятный случай — постепенная деградация сервиса: раз в несколько дней инстанс перезапускался из-за нехватки памяти, хотя нагрузка была ровной. Метрики ничего не показывали, поэтому снимаю heap dump перед падением и сравниваю два снимка — вижу стабильный рост числа объектов одного типа, которые никто не освобождает. Причина оказалась в собственном кеше без ограничения по размеру. Ограничиваю размер, добавляю алерт на потребление памяти: перезапуски прекратились, потребление стало стабильным. Поиск занял около двух недель, зато после фикса тема больше не всплывала.

Вопрос 2Middle

Опишите ситуацию, когда вы не согласились с архитектурным решением тимлида или команды.

Как отвечать ▾

Как отвечать: Покажите аргументацию на данных и прототипах, уважение к коллегам и готовность принять командное решение после обсуждения.

Пример сильного ответа

В одном проекте предлагалось синхронно вызывать внешний сервис прямо в обработке заказа. Мне такой вариант казался рискованным: любая задержка на той стороне тормозила бы весь поток. Вместо спора на словах собираю небольшой прототип с очередью и замеряю оба варианта на тестовой нагрузке — разница в устойчивости на пиках оказалась заметной. Показываю результаты команде, вместе обсуждаем компромиссы и выбираем вариант с очередью. Если бы решение всё равно приняли иначе, моя позиция — зафиксировать риски и дальше делать общее дело хорошо, а не тянуть в свою сторону.

Вопрос 3Для всех уровней

Как вы проводите code review и реагируете на критику своего кода?

Как отвечать ▾

Как отвечать: Сфокусируйтесь на читаемости, тестах и рисках, конструктивном тоне комментариев и восприятии замечаний как улучшения, а не личной критики.

Пример сильного ответа

Ревью для меня — про качество и общий контекст, а не про поиск виноватых. Смотрю небольшими порциями, в первую очередь логику и границы: обработку ошибок, конкурентность, тесты, читаемость. Замечания формулирую как вопросы или предложения с примерами, чтобы автору было понятно, почему. Критику своего кода воспринимаю спокойно: уточняю аргументы, объясняю решение, и если оппонент прав — правлю, а не спорю. Стараюсь укладываться в один рабочий день на ревью, чтобы задача не стояла. В команде из шести человек такой подход заметно снизил число возвратов на доработку.

Что спросят именно вас?

Типовые задают всем. По резюме спросят другое — «В резюме перерыв с 2024 года, чем вы занимались?». Покажем 5 таких вопросов бесплатно, а готовые ответы на них — под вашу вакансию и резюме — за 99 ₽.

Поделиться подборкой:TGVKWA

📈 Готовитесь к собеседованию? Получайте свежие вакансии Java-разработчик на почту или в Telegram — и откликайтесь, пока подготовка свежая.

бесплатно
PRO

Проверьте себя: первый разбор — бесплатно

Прочитать вопросы — это старт. Настоящая подготовка — проговорить ответ и услышать, что с ним не так. Первый разбор ИИ бесплатный и без регистрации, прямо на этой странице. Полная симуляция — в PRO или разово, без подписки.

  • ✓ Реальные вопросы по вашей роли
  • ✓ Разбор ответов с ИИ
  • ✓ Оценка и советы

Как пройти собеседование на позицию Java-разработчика

1. HR-этап

Подготовьте рассказ о себе на 1–2 минуты: последнее место работы, главный результат и причина интереса именно к этой вакансии. Для роли «Java-разработчик» HR чаще всего проверяет мотивацию и зарплатные ожидания — заранее сверьте их с медианой по рынку — 121 000 ₽ (блок «Зарплата» ниже на этой странице).

2. Профессиональный этап

Основная часть собеседования — вопросы по ключевым навыкам: Java Core, JVM и сборка мусора, Коллекции. Разберите категории «JVM, память и коллекции» и «Многопоточность и Stream API» из подборки выше и подготовьте по одному примеру из своего опыта на каждую — с цифрами и результатом.

3. Финальный этап

В финале обсуждают условия, график и задачи на испытательный срок. Подготовьте 2–3 вопроса работодателю о команде, метриках успеха и ближайших проектах — кандидаты, которые задают такие вопросы, запоминаются лучше.

План подготовки

  1. 1Повторите JVM: структуру памяти, поколения объектов, сборщики мусора и инструменты диагностики вроде jstack и heap dump.
  2. 2Пройдитесь по коллекциям: устройство HashMap, контракт equals/hashCode, сложность операций ArrayList, LinkedList и ConcurrentHashMap.
  3. 3Освежите многопоточность: synchronized, volatile, ReentrantLock, ExecutorService, deadlock и классы java.util.concurrent.
  4. 4Разберите Spring на практике: IoC и жизненный цикл бинов, прокси @Transactional, уровни изоляции и типовые ловушки самовызова.
  5. 5Подготовьте 2–3 истории о production-задачах: проблема N+1 в Hibernate, утечка памяти, оптимизация запросов или борьба с GC-паузами.
  6. 6Пройдите пробное интервью в тренажёре Rabota-Help и проверьте, что ответы конкретны, структурированы и опираются на ваш опыт.

Частые ошибки

  • Пересказывать теорию по JVM и коллекциям без примеров из собственных проектов.
  • Не знать контракт equals/hashCode и устройство HashMap — базовый вопрос, который решает многое.
  • Путать видимость и атомарность в многопоточности и считать volatile универсальной защитой.
  • Не уметь объяснить, почему @Transactional не сработал при самовызове метода.
  • Слышать про N+1, но не знать, как её найти в логах и устранить через fetch join или EntityGraph.
  • Отвечать на кейсы абстрактно, не называя конкретных инструментов: SQL-логи, метрики GC, thread dump.
Практика интервью

От вопросов — к тренировке интервью

Прочитайте вопросы, выберите 5–7 самых сложных и пройдите пробное интервью. ИИ-интервьюер поможет структурировать ответы, проверить аргументацию и подготовиться к реальному разговору.

Открыть тренажёр для роли Java-разработчик
Зарплата

Зарплата Java-разработчик в России

По данным 113 вакансий

Полная статистика →

P25 (ниже среднего)

65 000 ₽

Медиана

121 000 ₽

50% вакансий

P75 (выше среднего)

170 000 ₽

Медиана по уровню опыта

Без опыта

60 000 ₽

3–6 лет

170 000 ₽

Вопрос с каждого собеседования

«Какие у вас зарплатные ожидания?» — что ответить на собеседовании Java-разработчика

Называйте диапазон: от типичной зарплаты для вашего опыта до суммы на 10–15 % выше, но не выше уровня, который платит лишь четверть работодателей. Суммы на руки по России; в Москве и Санкт-Петербурге обычно выше.

Называйте 125 000 ₽ – 140 000 ₽ на руки.

Пример ответа рекрутеру — для типичной вакансии по России

«Рассматриваю предложения от 125 до 140 тысяч на руки — итоговая сумма зависит от задач и состава компенсации».

В поле «желаемая зарплата» — одна цифра, нижняя граница диапазона: 125 000 ₽. До вычета налога это ≈ 145 000 ₽.

Посчитать для вашего города и опыта

Покажем вашу сумму, готовые фразы на «сколько получаете сейчас» и «у нас бюджет до…», а если уже есть предложение — сравним его с рынком.

Навыки

Востребованные навыки Java-разработчика

Частота упоминания в вакансиях работодателей

Все навыки →
1
Java9%
2
PostgreSQL6%
↑
3
Git6%
↑
4
Kubernetes6%
↑
5
Spring5%
↓
6
Docker5%
↑
7
REST5%
↑
8
Spring Boot5%
↓

Вы готовитесь к собеседованию. А работодатели уже ищут Java-разработчика.

Создайте анонимный публичный профиль — его найдут в Яндексе и Google, и предложения придут сами. Контакты скрыты, пока вы не решите иначе.

Работодатели уже ищут: Java-разработчик · от 121 000 ₽

Создать анонимный профиль — бесплатно

Пройдите мини-собеседование, добавьте резюме на экране результата — профиль создадим за минуту, с вашего согласия.

Вы нанимаете Java-разработчика? Профили кандидатов и подбор для работодателей →

Вакансии

Свежие вакансии Java-разработчика: 599

Откройте подходящие предложения и откликнитесь после подготовки к собеседованию.

Смотреть вакансии →

Откликаетесь на вакансии Java-разработчика? Приложите сопроводительное письмо

Пример письма для этой профессии и генератор, который напишет письмо под текст вакансии. Первое письмо — бесплатно.