java-interview

Собес в Сбер · Java Middle

Вопросы, задачи и реальные кейсы с технических интервью.

Темы: JavaCore · JVM · Collections · Multithreading · Spring · SQL · System Design

← Ко всем гайдам · Канал JavaJub в Telegram


1. Как устроен отбор

В Сбере больше 2 000 продуктовых команд, и каждая может адаптировать процесс под себя. Но общая схема для Java Middle в 2025–2026 годах выглядит так:

Этап Длительность Что проверяют
HR-скрининг 30–40 мин Мотивацию, ожидания по ЗП, общий опыт, стек
Тех-скрининг 30–45 мин Базовый синтаксис, SQL, Big-O, коллекции
Java + Code review 60–90 мин JavaCore, JVM, многопоточность, контракты
System Design 60–90 мин Проектирование (для Middle+ — опционально)
Team Match 60 мин Soft skills, ценности, выбор команды

Как выглядит тех-секция

ФИШКА. Особенность Сбера Реже дают чистые алгоритмы (в отличие от Яндекса и VK). Чаще — код с неочевидными багами, который компилируется и проходит тесты, но тихо ломает данные в проде. Смотрят, видишь ли ты контракты языка «под капотом».

2. Стек и темы, которые спрашивают

В 2026 году стандарт в Сбере — Java 21 LTS (местами уже Java 25), Spring Boot 3.x, PostgreSQL-совместимая Pangolin, Kafka-совместимая Corax, Kubernetes внутри Platform V.

Обязательный минимум для Middle

Плюсом будет

3. Java Core & ООП

Самый частый блок. Для Middle ждут не только знания, но и понимания «почему так».

Типовые вопросы

СОВЕТ. Лайфхак На любой вопрос про контракт equals/hashCode обязательно приведите пример: «если я положу объект в HashSet, а потом изменю поле, участвующее в hashCode, — я его больше не найду». Это показывает понимание, а не заученность.

4. Collections Framework

HashMap — абсолютный чемпион по числу упоминаний. Спрашивают все и всегда.

5. JVM, память, GC

6. Многопоточность и JMM

Для Middle этот блок — обязательный. Готовьтесь подробно.

ЛОВУШКА · Классика Сбера Попросить написать double-checked locking singleton. Если кандидат забыл volatile на instance — это минус. Спросите себя: зачем здесь volatile? (Ответ: без него возможна публикация «полусозданного» объекта другим потоком из-за reordering).

7. Spring и Spring Boot

8. Базы данных и SQL

В Сбере — PostgreSQL-совместимая Pangolin. Ждут реальное знание Postgres, а не «умею писать

SELECT *».

9. Микросервисы и архитектура

10. Практические задачи

Эти задачи реально давали кандидатам в Сбер на Java Middle. Ключевая особенность — любят код с неочевидными багами и просят code review.

Задача 1. Code Review класса Person (★ легенда Сбера)

ФИШКА Эта задача (или её вариации) встречается в транскрипциях собеседований в Сбер десятки раз. Вариации меняются, суть остаётся.

Формулировка: перед вами класс Person с аннотациями Serializable, Externalizable, методом clone() и JAXB-разметкой. В коде 8 багов. Найдите все, объясните последствия, предложите фикс. Время — 20 минут.

Чек-лист багов, которые нужно увидеть 1. Нет no-arg конструктора → при десериализации через Externalizable упадёт InvalidClassException. Externalizable требует публичный конструктор без параметров. 2. В writeExternal/readExternal поля пишутся и читаются в разном порядке (например: write name→surname→phone→address, read name→surname→address→phone). Компилируется, тесты на null-полях зелёные, а в проде у клиента в поле «адрес» записывается телефон. 3. clone() объявлен, но класс не реализует Cloneable → CloneNotSupportedException, обёрнутый в Error. 4. Поверхностное клонирование (shallow copy) — коллекции и Date-поля делятся между оригиналом и копией. 5. hashCode() возвращает константу (например, 1). Все объекты падают в один bucket. В Java 8+ — O(log n) через red-black tree, но всё равно деградация производительности. 6. equals() нарушает контракт: использует не те поля, что hashCode, или не симметричен/не транзитивен. 7. Mutable поле (java.util.Date) возвращается наружу без defensive copy — клиент может его изменить. 8. JAXB-аннотации на final-поле без сеттера / не тот access type → маршаллинг работает некорректно или вообще падает.

ЛОВУШКА · Самый коварный баг Перепутанный порядок полей в writeExternal/readExternal. Всё компилируется, все тесты проходят — но в проде данные тихо переезжают из поля в поле. В банковском софте это стоит денег.

Задача 2. Окно транзакций

Формулировка: дан отсортированный по возрастанию массив timestamp’ов транзакций (в секундах) и длина окна N секунд. Найдите максимальное количество транзакций, попадающих в любое окно длиной ≤ N.

Эталон: техника «два указателя»

public int maxTransactions(int[] timestamps, int n) {
    int left = 0;
    int maxCount = 0;
    for (int right = 0; right < timestamps.length; right++) {
        while (timestamps[right] - timestamps[left] > n) {
            left++;
        }
        maxCount = Math.max(maxCount, right - left + 1);
    }
    return maxCount;
}

Сложность: O(n) по времени, O(1) по памяти. Оба указателя в сумме делают не больше 2n шагов.

О чём обязательно сказать

Задача 3. Rate Limiter

Формулировка: реализуйте компонент, ограничивающий запросы: не более K запросов от одного пользователя за окно T секунд. Сервис многопоточный. Обсудите хотя бы два алгоритма.

Варианты, которые нужно обсудить

Скелет in-memory реализации

 public class SlidingWindowRateLimiter {
     private final int limit;
     private final long windowMs;
     private final ConcurrentHashMap<String, Deque<Long>> userRequests =
             new ConcurrentHashMap<>();

      public SlidingWindowRateLimiter(int limit, long windowMs) {
          this.limit = limit;
          this.windowMs = windowMs;
      }

      public boolean allow(String userId) {
          long now = System.currentTimeMillis();
          Deque<Long> window = userRequests.computeIfAbsent(
                  userId, k -> new ArrayDeque<>());
          synchronized (window) {
                  while (!window.isEmpty() && window.peekFirst() <= now - windowMs) {
                      window.pollFirst();
                  }
                  if (window.size() >= limit) return false;
                  window.addLast(now);
                  return true;
              }
        }
}

Подвохи, которые спросят

Задача 4. Упрощённая ConcurrentHashMap с сегментами

Формулировка: напишите потокобезопасный Map с сегментной блокировкой. Не JDK-версию один-в-один, а упрощённую — важно показать принцип.

ФИШКА. Контекст вопроса Сегменты (класс Segment) — это реализация Java 7. В Java 8+ ConcurrentHashMap использует CAS + synchronized на головах бакетов. Задача учебная — показать понимание, зачем вообще нужна шардированная блокировка.

Идея решения

Типовые ошибки

Задача 5. Свой HashMap

Формулировка: реализуйте MyHashMap<K, V> с методами put, get, remove. Опишите, как разрешаются коллизии и когда делать resize.

Что должно быть в решении

Задача 6. Producer-Consumer без BlockingQueue

Формулировка: классическая задача на wait/notify. BlockingQueue использовать нельзя.

 public class BoundedBuffer<T> {
     private final Queue<T> queue = new LinkedList<>();
     private final int capacity;

      public BoundedBuffer(int capacity) {
          this.capacity = capacity;
      }

      public synchronized void put(T item) throws InterruptedException {
          while (queue.size() == capacity) {
              wait();
          }
          queue.add(item);
              notifyAll();
        }

        public synchronized T take() throws InterruptedException {
            while (queue.isEmpty()) {
                wait();
            }
            T item = queue.poll();
            notifyAll();
            return item;
        }
}

Ключевые моменты, на которые смотрит интервьюер

Задача 7. SQL про транзакции

Формулировка: есть таблицы accounts(id, user_id, balance) и transactions(id, from_account, to_account, amount, created_at). Найдите пользователей, у которых за последние 24 часа суммарно ушло со счетов больше 1 млн рублей. Отсортируйте по сумме по убыванию.

Эталон (PostgreSQL)

SELECT a.user_id, SUM(t.amount) AS total_out
FROM transactions t
JOIN accounts a ON a.id = t.from_account
WHERE t.created_at >= NOW() - INTERVAL '24 hours'
GROUP BY a.user_id
HAVING SUM(t.amount) > 1000000
ORDER BY total_out DESC;

Почти наверняка спросят

Задача 8. System Design (для Middle+)

Популярные формулировки из реальных собеседований:

Обязательный каркас ответа 9. Уточнить требования: функциональные + нагрузка (RPS, объём, latency). 10. Back-of-the-envelope: RPS → IOPS → storage per day/year. 11. High-level components: клиент → LB → API Gateway → сервисы → хранилища. 12. Схема API: REST или gRPC, ключевые эндпоинты. 13. Выбор хранилищ с обоснованием (Postgres для транзакций, Redis для кэша, Kafka для событий). 14. Consistency vs availability: для финтеха чаще выбираем consistency. 15. Отказоустойчивость: репликация, шардирование, Circuit Breaker, retry с jitter. 16. Безопасность: шифрование at-rest и in-transit, RBAC, аудит, маскирование ПДн в логах. 17. Масштабирование: узкие места и как их расширять. 18. Наблюдаемость: какие метрики, логи, трейсы.

11. Поведенческое интервью

В Сбере hard skills — это примерно 70% успеха. Остальное — культурный фит. Отмечается: при прочих равных кандидат с чуть более слабой техникой, но с хорошей коммуникацией, получает оффер чаще.

Вопросы, которые реально задают

Формат ответа: STAR

СОВЕТ. Сильный ответ «В сервисе платежей при всплеске нагрузки появлялись таймауты. Я снял thread dump, увидел блокировку на synchronized в кэше курсов валют. Заменил на ConcurrentHashMap с computeIfAbsent — p99 упал с 1200 до 180 мс, инцидент на бизнес-метрику исчез». Конкретика + цифры + ваша роль.

12. План подготовки + финальный чек-лист

За 3–4 недели

  1. Перечитать Effective Java (Joshua Bloch), особенно главы про equals/hashCode, сериализацию и immutable-объекты — в Сбере это спрашивают постоянно. 20. Прорешать 20–30 задач на LeetCode (Easy + Medium): массивы, хэш-таблицы, два указателя, скользящее окно, деревья. 21. Повторить JVM и GC по докладам Алексея Шипилёва на YouTube. 22. Поднять локально проект на Spring Boot 3.x с PostgreSQL и Testcontainers, чтобы свежо помнить практику.

За неделю

  1. 2–3 мок-интервью (друзья, pramp.com, interviewing.io). 24. 5–10 разборов System Design (YouTube: «URL shortener», «payment system»), адаптируйте под финтех. 25. Подготовьте 3–4 истории по STAR из реального опыта. 26. Изучите основы Platform V, Pangolin, Corax — даже поверхностное знание выделит вас.

В день собеседования

ВНИМАНИЕ · Предупреждение AI-ассистенты и поисковики во время собеседования запрещены. По словам интервьюеров Сбера, это заметно — слишком ровные ответы, задержки перед каждой фразой, взгляд в сторону экрана. Репутационные последствия серьёзные.

Финальный чек-лист

Блок Готов, если можешь…
Java Core Объяснить контракт equals/hashCode на примере и показать, как его

нарушение ломает HashSet

Collections Рассказать, как устроен HashMap в Java 8+, и что делать, чтобы не получить O(n)

JVM Назвать области памяти, виды OOM и как их диагностировать
Многопоточность Написать потокобезопасный singleton 3 способами и объяснить роль

volatile

JMM Объяснить happens-before на примере volatile и synchronized
Spring Рассказать, почему @Transactional не работает при self-invocation
SQL Прочитать EXPLAIN, предложить индекс и объяснить, почему WHERE

лучше HAVING

Архитектура Объяснить CAP-теорему и выбор для платежей
Практика Написать sliding window и rate limiter с thread safety
Soft Рассказать 3 истории по STAR с конкретными цифрами

━━━━━━━━━━━━━━━━━━━━━━━━


Удачи на собесе!

// git push origin offer


Гайд из канала JavaJub — свежие разборы собесов выходят там первыми: @java_jub.

← Ко всем гайдам