Java
Вопросы по Java Core на собеседовании: ООП, коллекции, исключения
Java Core на собеседовании — это проверка фундамента. Интервьюер хочет понять, умеете ли вы объяснить ООП, выбирать коллекции, работать со строками, понимать исключения и не путаться в базовых правилах языка
Ниже — набор тем, которые стоит повторять не списком терминов, а через ответы и короткие примеры
По этой теме полезно отдельно посмотреть Создание динамических форм в React и Next.js, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Вопросы по Java на собеседовании, чтобы расширить контекст и сравнить подходы
ООП: четыре базовых идеи
Инкапсуляция скрывает состояние и открывает безопасные методы. Наследование позволяет расширять поведение, но его не стоит применять ради красоты. Полиморфизм дает возможность работать через общий тип. Абстракция оставляет важное и убирает детали
Хороший ответ на собеседовании: «Я стараюсь сначала думать о модели задачи. Если у объекта есть состояние и поведение, класс уместен. Если нужно только переносить данные, иногда достаточно record или простого DTO»
equals и hashCode
Если два объекта считаются равными через equals(), у них должен быть одинаковый hashCode(). Это важно для HashMap и HashSet
class User {
private final String email;
User(String email) {
this.email = email;
}
}
На интервью полезно сказать, что в реальном коде equals и hashCode часто генерируют IDE или используют record, если подходит модель данных
ArrayList, LinkedList, HashMap, HashSet
ArrayList чаще всего подходит для обычного списка. LinkedList редко нужен новичку и не является универсально быстрым. HashMap используется для доступа по ключу. HashSet — для уникальных значений
Set<String> tags = new HashSet<>();
tags.add("java");
tags.add("spring");
tags.add("java");
System.out.println(tags.size());
В ответе важно не просто назвать коллекции, а объяснить выбор под задачу
Generics
Generics помогают указать тип элементов и ловить ошибки на этапе компиляции
List<String> names = new ArrayList<>();
names.add("Анна");
String first = names.get(0);
Без generics пришлось бы приводить тип вручную и рисковать ошибкой во время выполнения
Исключения
Checked exceptions компилятор заставляет обработать или пробросить. Unchecked exceptions наследуются от RuntimeException и часто связаны с ошибкой логики: неверный индекс, null, неправильный аргумент
Сильный ответ: исключение не должно заменять обычную ветку бизнес-логики. Если ситуацию можно проверить условием заранее, иногда лучше сделать явную проверку
Stream API
Stream API помогает обрабатывать коллекции цепочкой операций: фильтр, преобразование, сбор результата
List<String> names = List.of("Anna", "Ivan", "Maria");
List<String> longNames = names.stream()
.filter(name -> name.length() > 4)
.toList();
System.out.println(longNames);
На собеседовании важно объяснять не только синтаксис, но и порядок операций
Многопоточность на базовом уровне
Junior редко должен глубоко знать concurrency, но базовые слова нужны: поток выполнения, race condition, synchronized, immutable object, executor
Простой ответ: если несколько потоков меняют одни и те же данные без синхронизации, результат может стать непредсказуемым
Как готовиться
Возьмите каждую тему и подготовьте три вещи: определение на два предложения, пример кода, типичную ошибку. Такой набор звучит живее, чем длинная шпаргалка
Как показывать глубину без лишней теории
На Java Core часто проверяют не заученное определение, а умение объяснить последствия. Например, equals и hashCode важны не сами по себе, а потому что HashMap и HashSet используют их для поиска и сравнения объектов
import java.util.Objects;
class User {
private final int id;
User(int id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User user)) return false;
return id == user.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
Если кандидат может объяснить, почему эти методы идут парой, ответ выглядит намного сильнее
Ответы, которые стоит подготовить заранее
| Тема | Что обязательно упомянуть |
|---|---|
| ООП | инкапсуляция, наследование, полиморфизм, абстракция |
| коллекции | когда выбирать List, Set, Map |
| исключения | checked и unchecked, где ловить ошибку |
| generics | типобезопасность и меньше cast |
| stream | читаемая обработка коллекций, но не магия |
| многопоточность | shared state, race condition, synchronized |
Частые ошибки
Заучивать сложные формулировки
Интервьюер быстро видит, когда человек не может объяснить пример. Лучше коротко, но своими словами
Называть LinkedList быстрым для всего
Это распространенный миф. Для большинства обычных задач ArrayList проще и практичнее
Не понимать hashCode
Если объект кладут в HashSet или ключом в HashMap, правила equals и hashCode становятся важными
Часто задаваемые вопросы
Нужно ли знать Spring для Java Core?
Spring полезен, но Java Core проверяет фундамент языка. Без него фреймворк будет пониматься поверхностно
Что делать, если не знаю ответ?
Скажите, что знаете частично, и попробуйте рассуждать от примера. Это лучше, чем уверенно говорить неверное
Какие темы повторить первыми?
ОПП, коллекции, строки, исключения, generics, базовый Stream API и простые задачи на код
Вопросы, где часто проверяют глубину
| Тема | Что важно сказать |
|---|---|
| Инкапсуляция | поля лучше закрывать, состояние менять через методы |
| Наследование | использовать, когда есть реальное отношение, а не ради повторного кода |
| Полиморфизм | работать через общий тип и подставлять разные реализации |
equals и hashCode |
равные объекты должны иметь одинаковый хеш |
| Коллекции | выбирать по задаче: порядок, уникальность, поиск по ключу |
Пример для equals и hashCode
record User(String email) {}
Set<User> users = new HashSet<>();
users.add(new User("a@example.com"));
users.add(new User("a@example.com"));
System.out.println(users.size());
record автоматически дает корректные equals и hashCode для полей. На собеседовании это хороший мостик: можно объяснить правило и показать современный короткий пример
Как отвечать на уточнения
Если интервьюер спрашивает «а почему», не повторяйте определение. Свяжите тему с ошибкой: неправильный hashCode ломает поведение HashSet, слишком общий catch прячет проблему, наследование без смысла делает код жестким