Библиотека собеса по Java | вопросы с собеседований
6.43K subscribers
408 photos
9 videos
580 links
Вопросы с собеседований по Java и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/08c603b6

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Объясните happens-before отношение в Java Memory Model?

happens-before — это гарантированный порядок между операциями, который определяет, что эффект одной операции виден другой. Если операция A happens-before операции B, то все изменения, сделанные в A, будут видны к моменту B.

Примеры гарантий happens-before: запись в volatile поле и последующее чтение того же поля; блокировки synchronized; Thread.start() и Thread.join().

Без гарантии happens-before два потока могут видеть неверные или устаревшие значения: один поток записал в поле, другой не увидит это изменение.

🐸 Библиотека собеса по Java

#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
Что такое 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1
В чем разница между 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1👏1
✔️ 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍21🤔1
Самый востребованный навык в ИТ в 2026-м — навык создания ИИ-агентов

Мы полностью переработали курс «Разработка AI-агентов» под реалии 2026 года. Никакой долгой теории — с самого начала пишем код. Обучать и делиться набитыми шишками будут эксперты-практики из Газпромбанка, Альфа-Банка и других бигтехов.

В программе:

— архитектура автономных систем с тестированием, ReAct-циклами и контролем токенов;
— практическая работа с актуальными фреймворками LangGraph, AutoGen, MCP и CrewAI;
— настройка продвинутого RAG для парсинга документов и точного поиска;
— внедрение решений с учётом действующего законодательства (152-ФЗ);
— дипломная работа, за основу которой можно взять свой рабочий проект или задачу, которую предложим мы.

Эксперты поделятся инсайтами из реального продакшна — тем, о чём вам никогда не расскажет ни одна нейросеть.

Запись первого открытого вебинара, на котором мы вместе с руководителем AI-направления в Альфа-Банке Полиной Полуниной пилили агента в прямом эфире.


Ах да, чуть не забыли! Дарим промокод AGENTSWEB на скидку 10 000 рублей и два курса сверху при покупке до 15 марта 🎁

Стать AI-инженером
💬 Обратная связь

Как часто вы проходите собеседования?

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

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
😁24🔥178👍5
Какие уровни изоляции транзакций существуют?

Существует 4 основных уровня изоляции транзакций, каждый из которых определяет степень видимости данных, изменённых в одной транзакции, для других транзакций:

🔹 READ UNCOMMITTED

Наименьший уровень изоляции. Другие транзакции могут читать изменения, которые ещё не были зафиксированы (не коммитнуты). Это может привести к грязным чтениям.

🔹 READ COMMITTED

Транзакция видит только те изменения, которые были зафиксированы другими транзакциями. Это предотвращает грязные чтения, но допускает неповторяемые чтения.

🔹 REPEATABLE READ

Гарантирует, что данные, считанные в рамках одной транзакции, не изменятся до её завершения (не допускаются неповторяемые чтения). Однако, могут возникать фантомные чтения.

🔹 SERIALIZABLE

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

Реализуется через блокировки (Lock-based): БД ставит range locks — блокирует не только существующие строки, но и диапазоны, куда могут вставиться новые. Это устраняет все виды аномалий, но может значительно снизить производительность.


🐸 Библиотека собеса по Java

#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥1
Что такое стабы (stubs) в контексте тестирования?

Стабы — это объекты, которые заранее задают фиксированное поведение для тестируемых зависимостей.

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

🐸 Библиотека собеса по Java

#tests
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1💯1
Кажется, мы окончательно перешли от игрушек к суровому AgentOps

Приглашаем на наш обновлённый курс по разработке ИИ-агентов. Никакой воды про «будущее нейросетей», только инженерный подход.

На курсе мы:

— пошагово строим готовые системы на LangGraph, CrewAI и MCP;
— настраиваем кэширование и роутинг, чтобы бот не сожрал токены;
— разбираемся со стейтом, учимся дебажить через time-travel и прикручиваем human-in-the-loop;
— выводим RAG в прод так, чтобы безопасники не завернули архитектуру из-за 152-ФЗ.

В пекло скучные лекции про общую инфраструктуру — сразу фокусируемся на агентных фреймворках и написании кода. Занятия ведут бывалые лиды из Газпромбанка и Альфы, набившие шишки на реальных задачах.

Кстати, на днях мы пилили агента в прямом эфире, если пропустили — есть запись вебинара.


Сегодня последний день, когда можно забрать курс по старым ценам. Базовый тариф сейчас стоит 49 000 ₽ (вместо 62 990 ₽), продвинутый трек — 99 000 ₽ (вместо 124 990 ₽). Если не хочется отдавать всю сумму сразу, есть рассрочка. Торопитесь — на потоке осталось всего 5 мест!

Зафиксировать цену и перейти к сборке своих агентов
😢1
Что такое String Pool?

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

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64🔥2
В чём разница между ExecutorService.submit() и execute()?

execute() принимает Runnable, ничего не возвращает, асинхронно выполняет задачу.

submit() принимает Runnable или Callable, возвращает Future для отслеживания результата или статуса. Также позволяет отменить задачу через future.cancel() и обрабатывать исключения.

🐸 Библиотека собеса по Java

#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍5🔥2
Расскажите про иерархию исключений

В Java иерархия исключений начинается от класса Throwable, который делится на две ветки:

🔹 Error — критические ошибки JVM, например OutOfMemoryError. Их не обрабатывают, так как это сбои среды выполнения.
🔹 Exception — обрабатываемые ошибки приложения.

Внутри Exception выделяют:

🔹 Checked exceptions — наследники Exception. Проверяются во время компиляции. Требуют try-catch или throws. Пример: IOException, SQLException.
🔹 Unchecked exceptions — наследники RuntimeException. Возникают из-за ошибок в логике программы, проверка компилятором не требуется. Пример: NullPointerException, IndexOutOfBoundsException.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥1
✔️ 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍31
Начать рассказывать интервьюеру, как вы ловко дёргаете ручки API через базовый LangChain.

Звучит как отличный план, да? Нет, это мгновенный отказ.

В свежем отчёте по рынку GPU говорится, что 54% компаний стопают ИИ-внедрения тупо из-за конских затрат на инфраструктуру. На серверах более 70% стоимости — это видеокарты. Поэтому на собесах сейчас спрашивают не про красивые промпты, а про жёсткую экономику агентов.

По сути, от вас ждут понимания, как лимитировать ресурсы на лету, роутить запросы и дебажить отказы через механизм time-travel в LangGraph. Если вы до сих пор собираете ботов в ноутбуках, гляньте обновлённый курс «Разработка ИИ-агентов» — фокус там смещён с игрушечных концепций на суровый энтерпрайз.

Что требуют от мидлов и выше:

— интеграция мультиагентных систем по стандарту MCP;
— суровый AgentOps: метрики, трейсинг, защита от деградации пайплайнов;
— локальный деплой Open Source под 152-ФЗ (без этого в финтех можно даже не стучаться).

Прямо сейчас можно урвать курс с увесистой скидкой (49 000 ₽ 62 990 ₽ за базовый тариф и 99 000 ₽ 124 990 ₽ за продвинутый трек), но стоит поторопиться — на потоке осталось всего 5 мест.

👉 Подтянуть архитектуру до уровня прода
😁1
Что такое MVC?

MVC (Model-View-Controller) — это архитектурный шаблон, разделяющий приложение на три компонента:

▪️ Model (Модель) — содержит бизнес-логику
▪️ View (Представление) — отображает данные пользователю, получая их от модели
▪️ Controller (Контроллер) — обрабатывает входные данные (обычно от пользователя), вызывает нужные методы модели и обновляет представление

Этот подход упрощает сопровождение кода, позволяет разделить ответственность между слоями и облегчает тестирование.

🐸Библиотека собеса по Java

#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71😁1
В чём разница между Statement и PreparedStatement?

— Statement используется для выполнения простых SQL-запросов без параметров. Он формирует запрос как строку и каждый раз компилирует его заново, что может быть медленно и небезопасно.

— PreparedStatement предварительно компилируется базой данных и позволяет задавать параметры через плейсхолдеры. Что повышает производительность при многократном выполнении одного запроса и защищает от SQL-инъекций (данные не конкатенируются со строкой запроса, а подставляются корректно).

Поэтому в реальных проектах почти всегда используют PreparedStatement.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102👏1
Что такое денормализация в базах данных?

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

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2👏1
Как устроена под капотом HashMap?

Это структура данных, основанная на хешировании, реализующая интерфейс Map. Она использует массив бакетов, где каждый элемент хранится в виде пары "ключ-значение".

Основные моменты:

🔹 Хеширование: для каждого ключа вычисляется хеш-код с помощью метода hashCode(). Этот код используется для определения индекса в массиве бакетов.

🔹 Коллизии: если два разных ключа имеют одинаковый хеш-код (коллизия), они помещаются в один бакет. До Java 8 коллизии обрабатывались с помощью связанного списка, начиная с Java 8 — с помощью сбалансированных деревьев.

🔹 Динамическое расширение: когда нагрузка достигает 75% от текущего размера массива (порог загрузки), HashMap увеличивает размер массива в два раза и перераспределяет элементы, чтобы уменьшить вероятность коллизий.

🔹 Балансировка дерева: если в бакете больше 8 элементов, то список преобразуется в сбалансированное дерево, что улучшает производительность при большом количестве коллизий.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83😁1
Что такое ApplicationContext в Spring?

ApplicationContext — это центральный интерфейс контейнера Spring, который загружает метаданные конфигурации из XML-файлов, Java-классов или аннотаций, создаёт бины и управляет ими на протяжении всего жизненного цикла приложения, а также предоставляет расширенные функции для разработки приложений.

Он является расширением BeanFactory и добавляет дополнительные возможности, такие как поддержка аннотаций, автоматическое связывание зависимостей, интернационализацию и публикацию событий.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1
✔️ 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍3
😱 Если ваш продукт не умеет отдавать данные в формате, понятном AI-агенту, то вас просто не существует

Скрипт не будет кликать по красивым кнопкам в браузере, он уйдёт к конкуренту с нормальным API. Перестроить архитектуру под машинных клиентов — это уже не хайп, а необходимое условие сохранения конкурентоспособности.

Как адаптировать продукт и не исчезнуть из выдачи:

— интегрировать MCP и A2A-взаимодействие, чтобы агенты могли вас читать;
— научиться контролировать стоимость (лимиты, кэш, роутинг между моделями);
— настроить AgentOps: трейсинг, логирование и отлов регрессий.

Всё это ждёт вас на обновлённом курсе «Разработка AI-агентов». Мы специально сделали фокус на утилитарном инжиниринге и production-ready решениях.

Кстати, до 29 марта можно забрать курс с большой скидкой, и стоит поторопиться — мест на потоке всё меньше.

Зафиксировать цену и начать деплоить агентов без слива бюджета 👈
🥱1