Какие особенности Java вы знаете
Что проверяют
Знаете ли вы Java глубже списка «ООП, сборщик мусора, многопоточность» и понимаете ли, как язык живёт на Android, где нет классической JVM. Следом часто спрашивают про контракт equals/hashCode, checked-исключения или утечки памяти через Activity.
Как отвечать
- статическая типизация и ООП: классы, интерфейсы с
default-методами, одиночное наследование классов и реализация нескольких интерфейсов; - передача по значению: в метод всегда копируется значение, для объекта это копия ссылки. Поменять поля объекта можно, подменить сам объект у вызывающего нельзя;
- дженерики со стиранием: в рантайме
List<String>иList<Integer>это один класс, отсюда запрет наnew T(); - исключения: checked, которые компилятор заставляет обработать или объявить, и unchecked (
RuntimeException). В Kotlin checked-исключений нет, на смешанных проектах это важно; - память: сборщик мусора убирает недостижимые объекты, но не спасает, если ссылка на объект осталась;
- многопоточность:
Thread,ExecutorService,synchronized,volatile,java.util.concurrent, модель памяти с отношением happens-before; - функциональные элементы: лямбды, ссылки на методы, Stream API.
Затем Android-специфика. Исходники компилируются в байт-код, D8 переводит его в DEX, а исполняет ART с JIT и AOT-компиляцией по профилям. Новые возможности языка и часть API, например java.time на старых версиях Android, доступны через desugaring при сборке. AsyncTask объявлен устаревшим в API 30, для фоновой работы берут ExecutorService, WorkManager или корутины в Kotlin-коде.
Где спотыкаются
Говорят, что приложение работает на JVM и потому «пишется один раз, запускается везде». На устройстве исполняется ART, и не каждый класс стандартной Java там есть.
Называют AsyncTask рабочим инструментом или советуют Spring и Hibernate для Android. Это сразу выдаёт устаревший или чужой опыт.
Считают, что сборщик мусора исключает утечки. Нестатический внутренний класс или анонимный Handler держит неявную ссылку на Activity, и она живёт дольше экрана. Защита: статический класс с WeakReference или привязка к жизненному циклу.