Как пройти собеседование по Java: топ вопросов от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как пройти собеседование по 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

Блоги

Рекомендаций по книгам