Вопросы на собеседовании: Java
Реальные вопросы с Java-собеседований — не теория ради теории, а разбор конкретных ловушек и «что выведет этот код».
Курс «Вопросы на собеседовании: Java» состоит из 5 разделов и 15 уроков: Память и объекты, ООП в Java, Коллекции, Многопоточность и Исключения и особенности JVM. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Память и объекты
- Примитивы и обёртки: int vs Integer
Разница между int и Integer в Java: автоупаковка, unboxing, NullPointerException и когда обёртки замедляют программу.
- == или .equals(): частая ловушка
Почему new String("a") == new String("a") — false, что такое кеш Integer от -128 до 127, и как сравнивать объекты в Java правильно.
- Контракт hashCode() и equals()
Зачем переопределять hashCode() вместе с equals(), как HashMap использует оба метода вместе и что сломается, если забыть про hashCode.
- Примитивы и обёртки: int vs Integer
2 ООП в Java
- Интерфейс или абстрактный класс?
Когда в Java выбирать интерфейс, а когда абстрактный класс: default-методы, множественное наследование интерфейсов и разбор конфликтов на примерах кода.
- final, static и когда их использовать
Разница между final-переменной, методом и классом в Java, как работают static-поля и почему они — частая причина утечек памяти в долго работающих программах.
- Полиморфизм: override и overload
Чем override отличается от overload в Java, как работает позднее связывание методов и почему поля, в отличие от методов, не переопределяются, а скрываются.
- Интерфейс или абстрактный класс?
3 Коллекции
- ArrayList против LinkedList
Чем ArrayList отличается от LinkedList: сложность доступа по индексу и вставки, когда какой список реально быстрее — с примерами и цифрами O(1)/O(n).
- Как устроена HashMap изнутри
Бакеты, коллизии и hashCode() в HashMap: почему поиск в среднем работает за O(1), что ломает эту скорость и как не убить производительность плохим hashCode().
- Comparable и Comparator: сортировка объектов
Чем Comparable отличается от Comparator в Java: где объявлять сортировку по умолчанию, как отсортировать список объектов сразу по нескольким полям.
- ArrayList против LinkedList
4 Многопоточность
- Thread и Runnable: как запустить поток
Разбираем на собеседовании: чем Runnable лучше наследования от Thread, как правильно запускать потоки в Java и какую ошибку допускают новички.
- synchronized и volatile
Разбор для собеседования: что реально гарантируют synchronized и volatile в Java, почему volatile не заменяет блокировку и в каких случаях его достаточно.
- Race condition на живом примере
Race condition в Java на конкретном коде: как два потока портят общий счётчик, почему это происходит и три рабочих способа починить — от synchronized до AtomicInteger.
- Thread и Runnable: как запустить поток
5 Исключения и особенности JVM
- Checked и unchecked исключения
Разбираем, чем checked-исключения отличаются от unchecked, зачем Java заставляет писать throws и когда это раздражает даже опытных разработчиков.
- try-with-resources и finally
Разбираем порядок выполнения finally при исключении и автоматическое закрытие ресурсов через try-with-resources и интерфейс AutoCloseable.
- Сборщик мусора: как JVM освобождает память
Простыми словами о том, как работает сборщик мусора в Java: когда объект становится «мусором», идея поколений young и old generation.
- Checked и unchecked исключения