Как пройти собеседование по Java: топ вопросов от А до Я
Собеседование на позицию Java-разработчика — это не просто проверка знаний синтаксиса. Работодатель оценивает ваше понимание фундаментальных принципов, умение писать чистый код и способность решать реальные задачи. В этой статье мы собрали топ вопросов по Java, которые охватывают все ключевые темы: от основ ООП до многопоточности и фреймворков. Статья подойдет как для Junior, так и для Middle-разработчиков.
Мы разбили материал на логические блоки, чтобы вы могли системно подготовиться. Каждый вопрос сопровождается кратким ответом и примером кода на Java. Готовьтесь к собеседованию вместе с PythonLib!
1. Основы Java и ООП (Object-Oriented Programming)
1.1. Какие принципы ООП реализованы в Java?
Java поддерживает четыре основных принципа ООП: наследование (extends/implements), полиморфизм (перегрузка и переопределение методов), инкапсуляция (private поля + getters/setters) и абстракция (abstract class/interface).
// Пример инкапсуляции
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1.2. Чем отличается абстрактный класс от интерфейса?
До Java 8: абстрактный класс может содержать реализованные методы и поля, интерфейс — только абстрактные методы и константы. После Java 8 в интерфейсах появились default и static методы. Ключевое отличие: класс может реализовать множество интерфейсов, но наследовать только один абстрактный класс.
1.3. Что такое перегрузка и переопределение методов?
- Перегрузка (overloading): методы с одинаковым именем, но разными параметрами (компиляция).
- Переопределение (overriding): дочерний класс изменяет реализацию метода родителя (рантайм).
// Overloading
class Calculator {
int sum(int a, int b) { return a + b; }
double sum(double a, double b) { return a + b; }
}
// Overriding
class Animal {
void sound() { System.out.println("Some sound"); }
}
class Dog extends Animal {
@Override
void sound() { System.out.println("Bark"); }
}
2. Java Collections Framework
2.1. Назовите основные реализации List, Set и Map.
- List: ArrayList (быстрый доступ по индексу), LinkedList (быстрая вставка/удаление).
- Set: HashSet (на основе HashMap, не гарантирует порядок), TreeSet (сортированный), LinkedHashSet (сохраняет порядок вставки).
- Map: HashMap (быстрый доступ, null ключи), TreeMap (сортировка по ключу), LinkedHashMap (порядок вставки).
2.2. Как работает HashMap?
HashMap использует массив корзин (bucket) и хеш-функцию. При вставке ключа вычисляется его hashCode, затем определяется индекс корзины. Если в корзине уже есть элементы (коллизия), то используется связный список или красно-черное дерево (если элементов > 8). По умолчанию начальная емкость — 16, коэффициент загрузки — 0.75.
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.put("Python", 2);
System.out.println(map.get("Java")); // 1
2.3. Чем отличается ArrayList от LinkedList?
ArrayList основан на динамическом массиве, LinkedList — на двусвязном списке. ArrayList быстрее при доступе по индексу (O(1) против O(n)), но медленнее при вставке/удалении в середине (O(n) против O(1)). LinkedList требует больше памяти из-за хранения ссылок.
3. Многопоточность и Concurrency
3.1. Какие способы создания потоков существуют в Java?
- Наследование от класса
Threadи переопределениеrun(). - Реализация интерфейса
Runnableи передача в конструкторThread. - Реализация
Callable+FutureTaskдля возврата результата.
// Через Runnable
Runnable task = () -> System.out.println("Thread running");
new Thread(task).start();
3.2. Что такое synchronized и volatile?
synchronized обеспечивает взаимное исключение и видимость изменений между потоками. volatile гарантирует только видимость (запись сразу в основную память), но не атомарность. Для счетчиков лучше использовать AtomicInteger.
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
3.3. Что такое deadlock и как его избежать?
Deadlock (взаимная блокировка) возникает, когда два потока удерживают ресурсы, необходимые друг другу. Избежать можно с помощью: фиксированного порядка захвата блокировок, таймаутов (tryLock()), или использования высокоуровневых утилит из java.util.concurrent.
4. Spring Boot и популярные фреймворки
4.1. Что такое Dependency Injection (DI) и Inversion of Control (IoC)?
DI — это паттерн, при котором зависимости объекта передаются извне (через конструктор или сеттер). IoC — принцип, когда управление потоком программы передается контейнеру (например, Spring IoC контейнер). Spring использует аннотации @Autowired, @Component, @Service.
@Service
public class UserService {
private final UserRepository repo;
@Autowired
public UserService(UserRepository repo) {
this.repo = repo;
}
}
4.2. Какие аннотации Spring Boot вы знаете?
@SpringBootApplication— объединяет @Configuration, @EnableAutoConfiguration, @ComponentScan.@RestController— для создания REST API.@RequestMapping/@GetMapping/@PostMapping