Библиотека собеса по Java | вопросы с собеседований
6.48K subscribers
416 photos
10 videos
664 links
Вопросы с собеседований по Java и ответы на них.

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что происходит с объектом, когда на него не осталось ссылок?

Объект становится кандидатом на сборку мусора, но память освобождается не сразу.

GC ориентируется на достижимость от GC roots (стек потоков, статические поля, JNI-ссылки, активные локальные переменные). Пока объект достижим хотя бы по одной цепочке — он живой. Как только он перестаёт быть достижимым, он помечается недостижимым и память освобождается при ближайшем цикле сборки.

Если у объекта есть finalize() или он зарегистрирован в Cleaner/PhantomReference, освобождение откладывается на дополнительный цикл.

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51🔥1
Что такое escape analysis и какие оптимизации он даёт?

Это анализ JIT-компилятора, который определяет, «убегает» ли объект за пределы метода или потока.

Если объект создаётся и используется только локально и наружу не уходит, JVM может:

→ Scalar replacement — вообще не создавать объект в куче, а разложить его на отдельные поля в регистрах/на стеке. Это снимает нагрузку на GC.
→ Lock elision — убрать синхронизацию, если объект гарантированно не виден другим потокам.


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

#jvm
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42👍2
Возможна ли утечка памяти, несмотря на сборщик мусора?

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

Типичные источники:

неограниченные кеши и статические коллекции (static Map), которые растут без удаления;
незакрытые ресурсы (соединения, стримы);
слушатели/колбэки без отписки;
ThreadLocal в пуле потоков, где значение не очищается через remove() (поток переиспользуется и не умирает);
утечка класслоадеров при горячей перезагрузке.

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🔥1
⚡️ Продолжаем знакомить вас с экспертами курса AgentOps!

Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов: оптимизировать затраты на разработку и продакшен, внедрить model routing, semantic cache и систему алертов для контроля расходов
Эмиль Сатаев разберет Context Engineering: управление контекстом, защиту от prompt injection, работу с длинными контекстами и построение безопасного пайплайна входа для AI-систем
Михаил Бондаревский покажет, как подготовить инфраструктуру для AI-агентов: Docker, sandboxing, streaming, docker-compose и воспроизводимое окружение для разработки и продакшена
Мурат Хажгериев расскажет про Enterprise Integrations & MCP: когда MCP действительно нужен, как подключать внешние сервисы и реализовывать интеграции с OAuth2 delegation
Герман Сабиров разберет Governance & Compliance для AI-систем: data flow, audit logs, требования 152-ФЗ, локализацию данных и построение compliance-подхода на уровне архитектуры

Курс для backend-разработчиков, тимлидов и LLM инженеров о том, как внедрять AI-логику в бэкенд IT-продуктов и сохранять стабильность сервиса.

👉 Изучить обновленную программу AgentOps и занять место.
Что такое type erasure и какие ограничения он накладывает на дженерики?

generics дают типобезопасность на этапе компиляции, но в рантайме информация о типовых параметрах стирается: List<String> превращается в обычный List, а компилятор сам вставляет приведения типов. Сделано ради обратной совместимости со старым кодом.

Из-за стирания нельзя:

создать new T() или new T[];
использовать instanceof List<String>;
иметь статические поля типа T;
объявить два метода, отличающиеся только параметром типа (после стирания их сигнатуры совпадут).

Частичная информация о дженериках сохраняется в сигнатурах полей и методов и доступна через рефлексию, но не на уровне конкретных экземпляров.

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1👏1
Объясните правило PECS (Producer Extends, Consumer Super)?

Это правило выбора ограниченных wildcards в дженериках.

? extends T — ковариантность, структура-«производитель»: из неё можно безопасно читать как T, но нельзя добавлять элементы, потому что компилятор не знает точный подтип.

? super T — контравариантность, структура-«потребитель»: в неё можно безопасно добавлять T и его подтипы, но при чтении вернётся только Object.

Отсюда мнемоника: если коллекция только отдаёт данные (producer) → extends; если только принимает (consumer) → super.

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1👏1
✔️ Spring-тест: идемпотентность платёжного эндпоинта

Напишите защиту от двойного списания 👇

📦 Задание

Клиент при сетевом таймауте повторяет POST /payments и списание проходит дважды. Реализуйте идемпотентность по заголовку Idempotency-Key.

@PostMapping("/payments")
public PaymentResult pay(
@RequestHeader("Idempotency-Key") String key,
@RequestBody PaymentRequest request) {
// Ваша реализация
}


📋 Требования

— Повторный запрос с тем же ключом возвращает результат первого вызова и НЕ выполняет списание заново.
— Разные ключи → разные операции.
— Конкурентные запросы с одним ключом (двойной клик / параллельные ретраи) не должны привести к двойному выполнению.
— Ключ хранится с TTL (например, 24 часа).

Ставьте → 🔥, если нравится формат. Если нет → 🌚

💬 Решения под спойлер. Сравним, какое будет лучше.

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

#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍2👏1
Какие параметры у ThreadPoolExecutor и что произойдёт при переполнении?

Ключевые параметры: corePoolSize, maximumPoolSize, keepAliveTime, рабочая очередь и политика отказа.

Логика приёма задачи: если активных потоков меньше core — создаётся поток; иначе задача кладётся в очередь; если очередь заполнена и потоков меньше max — создаётся новый поток до максимума; если и это невозможно — срабатывает политика отказа (AbortPolicy бросает исключение, CallerRunsPolicy выполняет в вызывающем потоке, DiscardPolicy молча отбрасывает).

Опасность фабрик Executors: newFixedThreadPool использует неограниченную очередь, newCachedThreadPool использует неограниченное число потоков. Оба под нагрузкой ведут к OutOfMemoryError.

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

#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👏2🔥1
Чем livelock и starvation отличаются от deadlock?

Все три — проблемы прогресса, но механизм разный.

▪️ Deadlock — потоки заблокированы навсегда, ждут ресурсы друг друга и ничего не делают.

▪️ Livelock — потоки не заблокированы и активно работают, но из-за постоянной реакции друг на друга не продвигаются вперёд. Аналогия: два человека в коридоре бесконечно уступают дорогу в одну и ту же сторону.

▪️ Starvation (голодание) — поток в принципе мог бы работать, но ресурс постоянно перехватывают другие. Например, низкоприоритетный поток при жадных высокоприоритетных или несправедливый (unfair) лок.

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

#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1🎉1
📊 Хотите войти в Data Science, но математика кажется самым сложным этапом?

На практике большинство джунов спотыкаются не о Python, а о математическую базу:

▪️ Теорию вероятностей и статистику
▪️ Линейную алгебру
▪️ Математический анализ
▪️ Комбинаторику

Именно на этих темах строятся машинное обучение, аналитика данных и рекомендательные системы.

Освойте ключевые разделы математики, которые используются в Data Science и Machine Learning на курсе «Математика для Data Science».

Что вас ждет:

🔹 40+ видеолекций и 150+ практических заданий на Python
🔹 Проверка домашних работ и обратная связь от преподавателей
🔹 Подготовка к задачам с технических собеседований
🔹 Программа от преподавателей ВМК МГУ, НИУ ВШЭ и экспертов индустрии

Курс подойдет разработчикам, аналитикам и всем, кто планирует развиваться в Data Science и Machine Learning.

👉 Записаться на бесплатный демо-урок
Какой контракт связывает equals() и hashCode()?

Контракт: если два объекта равны по equals(), их hashCode() обязан быть одинаков. Обратное не требуется — равные хеши не означают равенство объектов (коллизии допустимы).

Если переопределить equals() и забыть про hashCode(), объект сломается в HashMap/HashSet: положили объект по одному хешу, ищем по другому, и не находим, хотя по equals() он равен.

Дополнительно equals() должен быть рефлексивным, симметричным, транзитивным и согласованным (не меняться без изменения полей).

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥1
ArrayList или LinkedList?

В подавляющем большинстве случаев → ArrayList.

ArrayList — это динамический массив: доступ по индексу O(1), вставка/удаление в середине O(n) из-за сдвига элементов. Но на практике он почти всегда быстрее за счёт локальности данных в памяти и дружбы с кешем процессора.

LinkedList — двусвязный список: вставка/удаление по уже найденной позиции O(1), но доступ по индексу O(n), и каждый элемент — отдельный объект с накладными расходами на ссылки.

LinkedList оправдан редко — например, когда нужен Deque с частыми вставками в оба конца. Для обычного списка берите ArrayList.

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👏2🔥1
Чем отличаются HashMap, Hashtable и ConcurrentHashMap

HashMap — не потокобезопасен, разрешает один null-ключ и null-значения, самый быстрый в однопоточном коде.

Hashtable — legacy-класс, синхронизирован целиком: один лок на всю таблицу, поэтому в многопоточке работает медленно. Не допускает null.

ConcurrentHashMap — потокобезопасен с тонкой блокировкой: с Java 8 синхронизация идёт на уровне отдельного бакета через CAS и synchronized, что даёт высокую конкурентность. null не допускает (чтобы не путать «нет ключа» и «значение null» при гонках).

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3👏1
✔️ Java-тест: задачка с реального собеса

Наш подписчик прислал реальную задачу с собеса в Яндекс. Сможете решить? 👇

📦 Задание

Реализуйте банкомат и тесты к нему. Инициализируется набором купюр, умеет выдавать купюры под заданную сумму либо отвечать отказом. При выдаче купюры списываются с баланса.
/**
* Банкомат.
* Инициализируется набором купюр, выдаёт купюры под сумму либо отказывает.
* При выдаче купюры списываются с баланса.
*
* Номиналы:
* - 50, 100, 500, 1000, 5000 ₽
* - 20, 100, 500 EUR
*
* Валюты обрабатываются раздельно, обмен не поддерживается.
* Банкомат может использоваться многопоточно (резервирование выдачи).
* Поддержку многопоточности можно вынести в отдельную итерацию.
*/
public class ATM {
public ??? withdraw(???) {
// TODO
}
}


📋 Требования


— Сами определите, что withdraw принимает и что возвращает.
— Валюты считаются раздельно, обмена нет.
— Сумму, которую нельзя собрать имеющимися купюрами, отклоняем (частичная выдача недопустима).
— Покройте решение тестами.
— Бонус: сделайте безопасным для вызова из нескольких потоков.

Ставьте → 🔥, если нравится формат. Если нет → 🌚

💬 Решения под спойлер. Сравним, какое будет лучше.

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

#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍4👏1
💻 3 курса по цене одного — собери стек для оффера в топовую IT-компанию

Для следующего карьерного шага мало писать код. Работодатели ждут не только знания языка, но и понимания архитектуры, алгоритмов, автоматизации, AI-инструментов и агентных систем.

Одно направление закрывает только часть задачи.

Поэтому сейчас мы предлагаем освоить сразу несколько востребованных навыков — выбери любой курс и получи доступ еще к двум бесплатно 🔥

Собери стек навыков под свою цель:

🔹 подготовка к сильным компаниям (алгоритмы, архитектура);
🔹 переход в AI-направление (ИИ-агенты, AgentOps);
🔹 развитие в ML и Data Science (математика, основы ML);
🔹 новый оффер и рост дохода.

Полученные знания применяешь в работе уже во время обучения.

Акция действует 48 часов — 13 и 14 июня.

👉 Переходи на сайт, выбирай курсы и оставляй заявку — за 10 минут поможем собрать комплект под твою цель.
Опишите жизненный цикл бина в Spring

Основные этапы:

1. Создание экземпляра (вызов конструктора).
2. Внедрение зависимостей (поля/сеттеры).
3. Вызов Aware-интерфейсов (BeanNameAware, ApplicationContextAware и т. д.).
4. BeanPostProcessor.postProcessBeforeInitialization.
5. @PostConstruct.
6. afterPropertiesSet() (InitializingBean), затем кастомный init-метод.
7. BeanPostProcessor.postProcessAfterInitialization — здесь навешиваются прокси (AOP, @Transactional).
8. Бин готов к использованию.

При завершении контекста: @PreDestroy → destroy() (DisposableBean) → кастомный destroy-метод.

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

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
🤖 Большинство материалов по ИИ-агентам устаревают быстрее, чем многие курсы успевают обновить программу

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

🚀 30 июня стартует курс «Разработка ИИ-агентов».

До 20 июня действует сниженная цена.

За 8 недель под руководством практиков из бигтеха вы соберёте собственного AI-агента, который работает с API, использует память, подключается к внешним сервисам и решает реальную задачу.

Что разберём:

🔹 архитектуру AI-агентов и надёжный вывод;
🔹 LangGraph и оркестрацию workflow;
🔹 MCP и работу с внешними инструментами;
🔹 RAG-системы;
🔹 AgentOps, observability и evals;
🔹 безопасность и защиту от prompt injection;
🔹 мультиагентные системы и A2A.

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

👉 Узнать программу и забронировать место со скидкой
💬 Обратная связь

Проверяем динамику роста комьюнити :)
Ваш текущий грейд:

🔥 — Senior
👍🏼 — Middle
❤️ — Junior
😁 — Ещё учусь

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26😁15🔥105
Почему @Transactional не срабатывает при вызове метода внутри того же класса?

Потому что @Transactional работает через прокси. Spring оборачивает бин в прокси-объект, и транзакция открывается, когда вызов проходит через этот прокси извне.

Если же метод класса вызывает другой @Transactional-метод того же класса напрямую (this.method()), вызов идёт мимо прокси — аннотация просто игнорируется, транзакция не открывается. Это называется self-invocation.

Решения:

- вынести транзакционный метод в отдельный бин;
- инжектить ссылку на самого себя (self-injection) и вызывать через неё;
- переключиться на AspectJ-режим вместо проксей.

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

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1👏1
🔥 Чем больше агентов — тем лучше? Не всегда. Уже завтра поговорим о реальных ограничениях на открытом уроке «Мультиагентные системы: почему большинство архитектур переусложнены».

Спикер — Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru.

После урока вы:

🔹 будете лучше ориентироваться в выборе между одним агентом и мультиагентной системой;
🔹 поймёте, какие архитектурные ошибки встречаются чаще всего;
🔹 получите практические ориентиры для проектирования и внедрения агентных систем;
🔹 будете лучше понимать возможности и ограничения современных ИИ-агентов.

🗓️ 18 июня, 19:00 (МСК)
⏱️ 90 минут

👉 Зарегистрироваться и получить промокод на 10 000 ₽
Чем fail-fast итераторы отличаются от fail-safe?

fail-fast (ArrayList, HashMap) бросают ConcurrentModificationException при структурном изменении коллекции во время обхода. Механизм — счётчик modCount, который итератор сверяет на каждом шаге. Это способ быстро отловить баг, а не средство защиты.

fail-safe (CopyOnWriteArrayList, ConcurrentHashMap) не бросают исключение:
- CopyOnWriteArrayList при модификации копирует внутренний массив, итератор работает со «снимком» старого состояния;
- итератор ConcurrentHashMap слабо-согласованный (weakly consistent) — отражает состояние на момент создания или позже, без жёстких гарантий.

Fail-safe безопасны в многопоточке, но итератор может не видеть свежие изменения и обходятся дороже по памяти.

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥1