Собеседование Java-разработчика охватывает семантику языка, коллекции, многопоточность, Spring и умение рассуждать о JVM. Ниже — вопросы, которые задают чаще всего, каждый с эталонным ответом. Junior: базовая теория, определения и простые практические кейсы.
1
В чём разница между == и equals() для объектов?
Ответ
== сравнивает ссылки — указывают ли две переменные на один объект в памяти. equals() сравнивает содержимое, если класс его переопределил; по умолчанию Object.equals сводится к тому же ==. Именно поэтому две строки, собранные в рантайме, дают false при == и true при equals(), и это самая частая ловушка на собеседовании по Java.
2
Чем интерфейс отличается от абстрактного класса?
Ответ
Абстрактный класс может хранить состояние и иметь конструкторы, он описывает, чем объект является; наследоваться можно только от одного. Интерфейс описывает, что объект умеет, и реализовать их можно много. С Java 8 у интерфейсов есть default-методы, поэтому практическое правило такое: общее состояние — абстрактный класс, общая способность — интерфейс.
3
Что такое автоупаковка и где она подводит?
Ответ
Автоупаковка — это автоматическое преобразование между примитивами и обёртками. Подводит она в двух местах: сравнение обёрток через == случайно работает для маленьких значений из-за кеша Integer от -128 до 127 и потом тихо перестаёт работать, а распаковка null-Integer бросает NullPointerException в строке, которая выглядит обычной арифметикой.
4
Объясните final, finally и finalize.
Ответ
Несмотря на схожие имена, они не связаны. final запрещает переприсваивание переменной, переопределение метода или наследование класса. finally — блок, который выполняется независимо от того, было исключение или нет, для освобождения ресурсов. finalize — метод, который сборщик мусора мог вызвать перед удалением объекта; он ненадёжен и объявлен устаревшим, вместо него try-with-resources.
5
Чем ArrayList отличается от LinkedList?
Ответ
ArrayList оборачивает расширяемый массив: доступ по индексу O(1), но вставка в середину сдвигает всё, что после неё. LinkedList — двусвязный список: вставка у известного узла O(1), но добраться до индекса n стоит n шагов, и каждый элемент несёт накладные расходы на указатели. На практике ArrayList выигрывает почти всегда, потому что локальность кеша важнее асимптотики на реальном железе.
6
Что на самом деле означает ключевое слово static?
Ответ
Static-член принадлежит классу, а не экземпляру: он существует в одном экземпляре независимо от количества объектов и доступен без создания объекта. Забывают о следствии — статическое поле это разделяемое изменяемое состояние на всё приложение, что удобно для констант и служит источником тяжёлых багов для всего, что меняется.
7
В чём разница между checked и unchecked исключениями?
Ответ
Checked наследуются от Exception, и компилятор заставляет их поймать или объявить; они описывают ситуации, из которых вызывающий может разумно восстановиться, например отсутствие файла. Unchecked наследуются от RuntimeException и сигналят об ошибках программиста — null, неверный аргумент. Unchecked для багов, checked умеренно, потому что принуждение обрабатывать обычно рождает пустые catch-блоки.
8
Каков контракт между `equals()` и `hashCode()`?
Ответ
Если два объекта равны, они обязаны возвращать одинаковый хеш-код; обратное не требуется. Нарушите — и HashMap перестанет работать: вы кладёте объект, ищете по равному ему и получаете null, потому что поиск ушёл в другую корзину. Поэтому переопределение одного без другого — баг, а не вопрос стиля.
9
Почему `String` в Java неизменяемый?
Ответ
Потому что он разделяемый. Литералы живут в пуле строк, и на один экземпляр может ссылаться много мест, так что изменяемая строка позволила бы одному держателю поменять значение у другого. Неизменяемость заодно делает строки потокобезопасными без синхронизации, позволяет кэшировать хеш-код и оставляет их безопасными для загрузки классов и параметров подключения, где поздняя подмена была бы дырой в безопасности.
10
Можно ли переопределить статический метод?
Ответ
Нет, его можно только скрыть. Переопределение разрешается во время выполнения по типу объекта, а статический метод — во время компиляции по типу ссылки. Поэтому подкласс с той же статической сигнатурой не заменяет родительский: выполнится тот, что соответствует объявленному типу, а не фактическому объекту, — ровно поэтому вызывать статику через ссылку на экземпляр не рекомендуют.
🦎
Прочитать ответы недостаточно
На собеседовании ты говоришь вслух под давлением. Кем задаст эти же вопросы, оценит каждый ответ и покажет, что именно подтянуть.
Пройти интервью Junior Java Backend →Бесплатно · 3 интервью в месяц