fa
Feedback
Библиотека собеса по Java | вопросы с собеседований

Библиотека собеса по Java | вопросы с собеседований

رفتن به کانال در Telegram

Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/08c603b6 Для обратной связи: @proglibrary_feeedback_bot

نمایش بیشتر
6 485
مشترکین
+124 ساعت
+87 روز
+1330 روز
آرشیو پست ها
✔️ Java-тест: утечка в фильтре Memory leak, который живёт неделями и не воспроизводится локально 👇 📦 Задание — code review Написали фильтр для аудита запросов. В продакшне через несколько дней — OutOfMemoryError.
@Component
public class AuditFilter implements Filter {

    private static final ThreadLocal<AuditContext> CONTEXT =
        new ThreadLocal<>();

    @Override
    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain
    ) throws IOException, ServletException {

        AuditContext ctx = new AuditContext(
            ((HttpServletRequest) request).getRequestURI(),
            System.currentTimeMillis()
        );
        CONTEXT.set(ctx);

        try {
            chain.doFilter(request, response);
        } finally {
            auditLog(CONTEXT.get());
        }
    }

    public static AuditContext current() {
        return CONTEXT.get();
    }

    private void auditLog(AuditContext ctx) {
        // пишем в БД...
    }
}
▪️ Объясни — Почему объекты в ThreadLocal не собираются GC, даже если запрос завершён. — Какая одна строчка кода здесь отсутствует, и где именно она должна быть. * Есть ли риски при использовании ThreadLocal в virtual threads (Project Loom)? Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

Что такое ApplicationContext в Spring? ApplicationContext — это центральный интерфейс контейнера Spring, который загружает метаданные конфигурации из XML-файлов, Java-классов или аннотаций, создаёт бины и управляет ими на протяжении всего жизненного цикла приложения, а также предоставляет расширенные функции для разработки приложений. Он является расширением BeanFactory и добавляет дополнительные возможности, такие как поддержка аннотаций, автоматическое связывание зависимостей, интернационализацию и публикацию событий. 🐸 Библиотека собеса по Java #spring

Как устроена под капотом HashMap? Это структура данных, основанная на хешировании, реализующая интерфейс Map. Она использует массив бакетов, где каждый элемент хранится в виде пары "ключ-значение". Основные моменты: 🔹 Хеширование: для каждого ключа вычисляется хеш-код с помощью метода hashCode(). Этот код используется для определения индекса в массиве бакетов. 🔹 Коллизии: если два разных ключа имеют одинаковый хеш-код (коллизия), они помещаются в один бакет. До Java 8 коллизии обрабатывались с помощью связанного списка, начиная с Java 8 — с помощью сбалансированных деревьев. 🔹 Динамическое расширение: когда нагрузка достигает 75% от текущего размера массива (порог загрузки), HashMap увеличивает размер массива в два раза и перераспределяет элементы, чтобы уменьшить вероятность коллизий. 🔹 Балансировка дерева: если в бакете больше 8 элементов, то список преобразуется в сбалансированное дерево, что улучшает производительность при большом количестве коллизий. 🐸 Библиотека собеса по Java

Что такое денормализация в базах данных? Денормализация — это процесс преднамеренного добавления избыточности в структуру базы данных для повышения производительности чтения. В отличие от нормализации, цель которой — устранить дублирование и обеспечить целостность, денормализация может включать дублирование данных, объединение таблиц или добавление агрегированных колонок. 🐸 Библиотека собеса по Java #core

В чём разница между Statement и PreparedStatement? — Statement используется для выполнения простых SQL-запросов без параметров. Он формирует запрос как строку и каждый раз компилирует его заново, что может быть медленно и небезопасно. — PreparedStatement предварительно компилируется базой данных и позволяет задавать параметры через плейсхолдеры. Что повышает производительность при многократном выполнении одного запроса и защищает от SQL-инъекций (данные не конкатенируются со строкой запроса, а подставляются корректно). Поэтому в реальных проектах почти всегда используют PreparedStatement. 🐸 Библиотека собеса по Java #core

Что такое MVC? MVC (Model-View-Controller) — это архитектурный шаблон, разделяющий приложение на три компонента: ▪️ Model (Модель) — содержит бизнес-логику ▪️ View (Представление) — отображает данные пользователю, получая их от модели ▪️ Controller (Контроллер) — обрабатывает входные данные (обычно от пользователя), вызывает нужные методы модели и обновляет представление Этот подход упрощает сопровождение кода, позволяет разделить ответственность между слоями и облегчает тестирование. 🐸Библиотека собеса по Java #patterns

Начать рассказывать интервьюеру, как вы ловко дёргаете ручки API через базовый LangChain. Звучит как отличный план, да? Нет, это мгновенный отказ. В свежем отчёте по рынку GPU говорится, что 54% компаний стопают ИИ-внедрения тупо из-за конских затрат на инфраструктуру. На серверах более 70% стоимости — это видеокарты. Поэтому на собесах сейчас спрашивают не про красивые промпты, а про жёсткую экономику агентов. По сути, от вас ждут понимания, как лимитировать ресурсы на лету, роутить запросы и дебажить отказы через механизм time-travel в LangGraph. Если вы до сих пор собираете ботов в ноутбуках, гляньте обновлённый курс «Разработка ИИ-агентов» — фокус там смещён с игрушечных концепций на суровый энтерпрайз. Что требуют от мидлов и выше: — интеграция мультиагентных систем по стандарту MCP; — суровый AgentOps: метрики, трейсинг, защита от деградации пайплайнов; — локальный деплой Open Source под 152-ФЗ (без этого в финтех можно даже не стучаться). Прямо сейчас можно урвать курс с увесистой скидкой (49 000 ₽ 62 990 ₽ за базовый тариф и 99 000 ₽ 124 990 ₽ за продвинутый трек), но стоит поторопиться — на потоке осталось всего 5 мест. 👉 Подтянуть архитектуру до уровня прода

✔️ Java-тест: кэш убивает прод под нагрузкой Метрики норм, тесты зелёные, при пике трафика — БД ложится 👇 📦 Задание — code review Сервис отдаёт профили пользователей. Для ускорения добавили кэш на 5 минут.
@Service
@RequiredArgsConstructor
public class UserProfileService {

    private final UserRepository userRepository;
    private final RedisTemplate<String, UserProfile> redisTemplate;

    private static final Duration TTL = Duration.ofMinutes(5);

    public UserProfile getProfile(Long userId) {
        String key = "profile:" + userId;

        UserProfile cached = redisTemplate.opsForValue().get(key);
        if (cached != null) {
            return cached;
        }

        UserProfile profile = userRepository.findById(userId)
            .map(UserProfile::from)
            .orElseThrow(UserNotFoundException::new);

        redisTemplate.opsForValue().set(key, profile, TTL);
        return profile;
    }
}
▪️ Объясни — Что именно происходит при истечении TTL под нагрузкой. — Почему добавление @Cacheable над методом не спасёт ситуацию. Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

Расскажите про иерархию исключений В Java иерархия исключений начинается от класса Throwable, который делится на две ветки: 🔹 Error — критические ошибки JVM, например OutOfMemoryError. Их не обрабатывают, так как это сбои среды выполнения. 🔹 Exception — обрабатываемые ошибки приложения. Внутри Exception выделяют: 🔹 Checked exceptions — наследники Exception. Проверяются во время компиляции. Требуют try-catch или throws. Пример: IOException, SQLException. 🔹 Unchecked exceptions — наследники RuntimeException. Возникают из-за ошибок в логике программы, проверка компилятором не требуется. Пример: NullPointerException, IndexOutOfBoundsException. 🐸 Библиотека собеса по Java #core

В чём разница между ExecutorService.submit() и execute()? execute() принимает Runnable, ничего не возвращает, асинхронно выполняет задачу. submit() принимает Runnable или Callable, возвращает Future для отслеживания результата или статуса. Также позволяет отменить задачу через future.cancel() и обрабатывать исключения. 🐸 Библиотека собеса по Java #concurrency

Что такое String Pool? String Pool — это специальная область памяти, предназначенная для хранения уникальных строковых литералов. Когда строка создается в программе, JVM сначала проверяет, существует ли уже такая строка в String Pool. Если существует, то возвращается ссылка на неё, иначе создается новый объект в пуле. Это позволяет экономить память, так как одинаковые строки используют один и тот же объект в памяти, а не создаются заново при каждом использовании. 🐸 Библиотека собеса по Java #core

Кажется, мы окончательно перешли от игрушек к суровому AgentOps Приглашаем на наш обновлённый курс по разработке ИИ-агентов. Никакой воды про «будущее нейросетей», только инженерный подход. На курсе мы: — пошагово строим готовые системы на LangGraph, CrewAI и MCP; — настраиваем кэширование и роутинг, чтобы бот не сожрал токены; — разбираемся со стейтом, учимся дебажить через time-travel и прикручиваем human-in-the-loop; — выводим RAG в прод так, чтобы безопасники не завернули архитектуру из-за 152-ФЗ. В пекло скучные лекции про общую инфраструктуру — сразу фокусируемся на агентных фреймворках и написании кода. Занятия ведут бывалые лиды из Газпромбанка и Альфы, набившие шишки на реальных задачах.
Кстати, на днях мы пилили агента в прямом эфире, если пропустили — есть запись вебинара.
Сегодня последний день, когда можно забрать курс по старым ценам. Базовый тариф сейчас стоит 49 000 ₽ (вместо 62 990 ₽), продвинутый трек — 99 000 ₽ (вместо 124 990 ₽). Если не хочется отдавать всю сумму сразу, есть рассрочка. Торопитесь — на потоке осталось всего 5 мест! → Зафиксировать цену и перейти к сборке своих агентов

Что такое стабы (stubs) в контексте тестирования? Стабы — это объекты, которые заранее задают фиксированное поведение для тестируемых зависимостей. В отличие от моков, стабы не проверяют взаимодействие, а просто возвращают заранее подготовленные значения или подставляют данные, когда вызывается метод. Стабы используются, чтобы минимизировать влияние внешних зависимостей на тестируемый компонент. 🐸 Библиотека собеса по Java #tests

Какие уровни изоляции транзакций существуют? Существует 4 основных уровня изоляции транзакций, каждый из которых определяет степень видимости данных, изменённых в одной транзакции, для других транзакций: 🔹 READ UNCOMMITTED Наименьший уровень изоляции. Другие транзакции могут читать изменения, которые ещё не были зафиксированы (не коммитнуты). Это может привести к грязным чтениям. 🔹 READ COMMITTED Транзакция видит только те изменения, которые были зафиксированы другими транзакциями. Это предотвращает грязные чтения, но допускает неповторяемые чтения. 🔹 REPEATABLE READ Гарантирует, что данные, считанные в рамках одной транзакции, не изменятся до её завершения (не допускаются неповторяемые чтения). Однако, могут возникать фантомные чтения. 🔹 SERIALIZABLE Все транзакции выполняются последовательно, как если бы они были выполнены по очереди. Реализуется через блокировки (Lock-based): БД ставит range locks — блокирует не только существующие строки, но и диапазоны, куда могут вставиться новые. Это устраняет все виды аномалий, но может значительно снизить производительность. 🐸 Библиотека собеса по Java #concurrency

💬 Обратная связь Как часто вы проходите собеседования? 🔥 — Сейчас активно ищу работу 👍🏼 — Раз в несколько месяцев ❤️ — Раз в полгода-год 😁 — Не прохожу, уже работаю/ещё учусь 🐸 Библиотека собеса по Java

💬 Обратная связь Как часто вы проходите собеседования? 🔥 — Сейчас активно ищу работу 👍🏼 — Раз в несколько месяцев ❤️ — Раз в полгода-год 😁 — Не прохожу, уже работаю/ещё учусь 🐸 Библиотека собеса по Java

Самый востребованный навык в ИТ в 2026-м — навык создания ИИ-агентов Мы полностью переработали курс «Разработка AI-агентов» под реалии 2026 года. Никакой долгой теории — с самого начала пишем код. Обучать и делиться набитыми шишками будут эксперты-практики из Газпромбанка, Альфа-Банка и других бигтехов. В программе: — архитектура автономных систем с тестированием, ReAct-циклами и контролем токенов; — практическая работа с актуальными фреймворками LangGraph, AutoGen, MCP и CrewAI; — настройка продвинутого RAG для парсинга документов и точного поиска; — внедрение решений с учётом действующего законодательства (152-ФЗ); — дипломная работа, за основу которой можно взять свой рабочий проект или задачу, которую предложим мы. Эксперты поделятся инсайтами из реального продакшна — тем, о чём вам никогда не расскажет ни одна нейросеть.
Запись первого открытого вебинара, на котором мы вместе с руководителем AI-направления в Альфа-Банке Полиной Полуниной пилили агента в прямом эфире.
Ах да, чуть не забыли! Дарим промокод AGENTSWEB на скидку 10 000 рублей и два курса сверху при покупке до 15 марта 🎁 Стать AI-инженером

✔️ Java-тест: что не так с этим сервисом? Код компилируется, тесты зелёные, в проде всё ломается 👇 📦 Задание — code review Сервис обрабатывает заявки на вывод средств. Требования простые: нельзя выводить больше, чем есть на балансе, и нельзя создавать две заявки одновременно.
@Service
@RequiredArgsConstructor
public class WithdrawalService {

    private final AccountRepository accountRepository;
    private final WithdrawalRepository withdrawalRepository;

    public void requestWithdrawal(Long userId, BigDecimal amount) {
        Account account = accountRepository.findByUserId(userId)
            .orElseThrow();

        if (account.getBalance().compareTo(amount) < 0) {
            throw new InsufficientFundsException();
        }

        boolean hasPending = withdrawalRepository
            .existsByUserIdAndStatus(userId, Status.PENDING);

        if (hasPending) {
            throw new WithdrawalAlreadyPendingException();
        }

        account.setBalance(account.getBalance().subtract(amount));
        accountRepository.save(account);

        withdrawalRepository.save(
            new Withdrawal(userId, amount, Status.PENDING)
        );
    }
}
🔹 Задачи Два запроса от одного пользователя прилетели одновременно. В итоге — баланс ушёл в минус и создались две заявки. ▪️ Объясни — Точную последовательность событий при конкурентных запросах. — Спасёт @Transactional над методом или нет? Почему? — Как исправить это корректно. Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

В чем разница между JRE, JVM и JDK? ▪️ JVM (Java Virtual Machine) — это виртуальная машина, которая выполняет байт-код. Она абстрагирует операционную систему и аппаратное обеспечение, предоставляя платформонезависимую среду для выполнения программ. ▪️ JRE (Java Runtime Environment) — это комплект программного обеспечения, включающий JVM и стандартные библиотеки Java, которые нужны для запуска Java-программ. ▪️ JDK (Java Development Kit) — это полный набор инструментов для разработки Java-программ. Он включает в себя JRE и дополнительные инструменты, такие как компилятор javac, отладчик, и другие утилиты для разработки. Таким образом, JDK включает в себя JRE, а JRE включает в себя JVM. 🐸 Библиотека собеса по Java #core

Что такое Virtual Threads, какие подводные камни при их включении? Virtual Threads (Project Loom) — это легковесные потоки JVM, которые не привязаны 1-к-1 к OS-потокам. Spring Boot 3.2+ поддерживает их из коробки — достаточно одной строчки:
propertiesspring.threads.virtual.enabled=true
Это переключает Tomcat, @Async, @Scheduled и TaskExecutor на виртуальные потоки. Что даёт: при blocking I/O (JDBC, HTTP-клиенты, файлы) виртуальные потоки освобождают carrier thread во время ожидания. Пропускная способность растёт без реактивного кода. 🔹 Подводные камни ▪️ Pinning — до Java 24 вход в synchronized блок или нативный код, и поток "пиннится" к carrier thread и блокирует его. ▪️ ThreadLocal — если у каждого виртуального потока свой ThreadLocal с тяжёлым объектом — heap быстро кончается. ▪️ Пулы соединений — виртуальных потоков может быть тысячи, и если каждый держит соединение из пула (HikariCP), пул быстро исчерпается. ▪️ CPU-bound задачи — Virtual Threads тут не помогут и могут даже навредить. Для счёта — обычный ForkJoinPool. Вывод: включается легко, но нужно понимать, где узкое место. Не серебряная пуля — это инструмент для I/O-bound нагрузки. 🐸 Библиотека собеса по Java #concurrency

Библиотека собеса по Java | вопросы с собеседований - آمار و تحلیل کانال تلگرام @java_interview_lib