Библиотека собеса по Java | вопросы с собеседований
Открыть в Telegram
Вопросы с собеседований по Java и ответы на них. По рекламе: @tproger_sales_bot Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot
Больше6 378
Подписчики
-324 часа
-237 дней
-5530 дней
Архив постов
❓ Что такое Happens-Before отношение?
Happens-Before — это гарантия видимости изменений между потоками в Java Memory Model.
Если действие A happens-before действия B, то все изменения памяти, сделанные в A, будут видны в B.
Примеры правил:
— разблокировка монитора happens-before следующей блокировки того же монитора.
— запись в volatile поле happens-before чтения из него.
— завершение потока happens-before join() на этом потоке.
Это фундаментальная концепция для понимания многопоточности в Java.
🐸 Библиотека собеса по Java
#concurrency
❓ В чём разница между Comparable и Comparator?
Comparable — это интерфейс для естественной сортировки объекта. Реализуется самим классом через метод compareTo(). Определяет одну стандартную логику сравнения.
Comparator — это внешний интерфейс для кастомной сортировки. Можно создать множество разных компараторов для одного класса, не меняя его код.
Comparable используется, когда есть очевидный способ сортировки (например, числа по возрастанию). Comparator — когда нужны разные варианты (по имени, по дате, по цене).
🐸 Библиотека собеса по Java
#core
❓ Как и где Spring ищет бины?
Spring ищет бины с помощью сканирования классов в указанных пакетах, используя аннотации (@Component, @Service, @Repository, @Controller и кастомные с @Component внутри).
Сканирование начинается с пакета, переданного в @ComponentScan или (по умолчанию) из того, где находится @SpringBootApplication (которая включает @ComponentScan).
Если бин не помечен аннотацией, его можно зарегистрировать вручную через @Bean в @Configuration-классе, BeanDefinitionRegistry или XML-конфиг.
🐸 Библиотека собеса по Java
#spring
❓ Что такое JIT-компилятор?
JIT (Just-In-Time) компилятор — это компонент JVM, который компилирует байт-код в машинный код непосредственно во время выполнения программы, а не до старта приложения. Его задача — улучшить производительность, оптимизируя код, исходя из реальных условий работы программы.
JIT компилирует только те части кода, которые реально исполняются, и может применять различные оптимизации для ускорения работы приложения. Это позволяет сочетать гибкость интерпретируемого байт-кода и производительность нативного кода.
🐸 Библиотека собеса по Java
#core
❓ Какие существуют состояния потока?
Thread может находиться в одном из следующих состояний (Thread.State):
1️⃣ NEW — поток создан, но еще не запущен.
2️⃣ RUNNABLE — поток готов к выполнению, но может ожидать процессорное время.
3️⃣ BLOCKED — поток ждет освобождения монитора для входа в synchronized блок.
4️⃣ WAITING — поток ожидает сигнал без тайм-аута.
5️⃣ TIMED_WAITING — поток ожидает, но с ограничением по времени.
6️⃣ TERMINATED — поток завершил выполнение.
🐸 Библиотека собеса по Java
#concurrency #лучшее2025
❓ Что такое микросервисы?
Микросервисы — это архитектурный стиль, при котором приложение разбивается на небольшие, независимые сервисы. Каждый сервис отвечает за определённую бизнес-логику, имеет собственную базу данных (или логически обособленное хранилище) и взаимодействует с другими сервисами через API (обычно REST или gRPC).
🔹 Ключевые принципы
— Можно обновлять и масштабировать отдельные сервисы без затрагивания всей системы.
— Каждый сервис выполняет свою узкую задачу.
— У сервиса свои изолированные данные, код и зависимости.
— Сервисы общаются через HTTP, AMQP, Kafka и другие механизмы.
🐸 Библиотека собеса по Java
#patterns #лучшее2025
❓ Что такое Dependency Injection?
Dependency Injection (внедрение зависимостей) — это один из основных паттернов проектирования в программировании, который позволяет объектам получать свои зависимости извне, вместо того чтобы создавать их внутри себя.
DI способствует:
— Слабой связанности между компонентами.
— Легкости тестирования за счет использования mock-объектов.
— Повторному использованию кода.
Основные способы внедрения зависимостей в Spring:
🔹 Constructor Injection
Зависимости передаются через конструктор.
public class Service {
private final Repository repository;
public Service(Repository repository) {
this.repository = repository;
}
}
🔹Setter Injection
Зависимости передаются через сеттеры.
public class Service {
private Repository repository;
public void setRepository(Repository repository) {
this.repository = repository;
}
}
🔹 Field Injection
Зависимости внедряются напрямую в поля класса (обычно с помощью фреймворков, например Spring).
@Component
public class Service {
@Autowired
private Repository repository;
}
#patterns
🐸 Библиотека собеса по Java💬 Обратная связь
Первый опрос по грейдам в этом году. Ваш грейд:
🔥 — Senior
👍🏼 — Middle
❤️ — Junior
😁 — Ещё учусь
🐸 Библиотека собеса по Java
❓ Как бы вы оптимизировали запрос с JOIN?
— Создание индексы на колонках, которые используются для соединений. Это ускорит поиск строк, особенно если соединяемые таблицы большие.
— Если возможно, уменьшить размер данных, участвующих в соединении. Для этого можно использовать подзапросы или фильтровать данные до соединения.
— Использование правильного типа JOIN.
— EXPLAIN для анализа выполнения запроса и выявления узких мест. Это покажет, как именно СУБД обрабатывает запрос и на каких этапах происходят замедления.
— Если запросы с JOIN используются часто, создать материализованные представления для хранения результатов, что снизит нагрузку на базу данных при повторных обращениях.
— Рассмотреть варианты изменения структуры БД (например, денормализация).
🐸 Библиотека собеса по Java
#core #лучшее2025
❓ Что такое авторизация и аутентификация?
▪️ Аутентификация — процесс проверки подлинности субъекта (пользователя или системы) на основе предоставленных им учетных данных (например, пары логин/пароль, сертификата или токена). Она подтверждает, что субъект является тем, за кого себя выдаёт.
▪️Авторизация — процесс определения прав и привилегий аутентифицированного субъекта в рамках определённой системы или ресурса. Она определяет, какие действия или ресурсы доступны субъекту после успешной аутентификации.
Аутентификация устанавливает личность субъекта, а авторизация — его полномочия в системе.
🐸 Библиотека собеса по Java
#core #лучшее2025
❓ Какие бывают гарантии доставки сообщений в Kafka?
В Kafka существует три уровня гарантий доставки сообщений:
1️⃣ At most once (максимум один раз)
Сообщение может быть потеряно, но никогда не будет обработано дважды. Producer отправляет сообщение и не ждет подтверждения (acks=0). Самый быстрый, но ненадежный вариант.
2️⃣ At least once (минимум один раз)
Сообщение гарантированно доставлено, но может быть обработано несколько раз. Producer ждет подтверждения от лидера (acks=1) или всех реплик (acks=all). При повторной отправке возможны дубликаты. Используется чаще всего.
3️⃣ Exactly once (ровно один раз)
Сообщение доставляется и обрабатывается строго один раз. Достигается через idempotent producer (enable.idempotence=true) и транзакции. Самый надежный, но с небольшим оверхедом по производительности.
Выбор зависит от задачи: для логов подойдет at most once, для финансовых операций — exactly once, для большинства случаев — at least once с идемпотентной обработкой.
🐸 Библиотека собеса по Java
#core #лучшее2025
+1
👀 Задача: Разработка высоконагруженного сервиса кеширования (middle+)
В компании возникла необходимость повысить производительность системы за счёт внедрения распределённого кеша.
Ваша задача — спроектировать и реализовать высоконагруженный сервис кеширования, обеспечивающий быструю и надёжную работу в условиях интенсивного использования.
▪️ Условия:
1. Высокая доступность: сервис должен быть устойчив к сбоям и обеспечивать непрерывную работу.
2. Масштабируемость: возможность горизонтального масштабирования для обработки увеличивающегося объёма данных.
3. Консистентность данных: обеспечение согласованности данных между узлами кеша.
4. Управление устареванием: реализация механизма автоматического удаления устаревших данных из кеша.
💡 Ключевые моменты:
— Выбор технологии: определение подходящего решения для распределённого кеширования (например, Redis, Memcached или собственная реализация).
— Репликация и шардирование: обеспечение надёжности и производительности через распределение данных и их дублирование.
— Алгоритмы замещения: выбор и реализация стратегий удаления устаревших или редко используемых данных (например, LRU, LFU).
✔️ Решение:
Использовать Redis в режиме кластеризации для обеспечения распределённого хранения данных. Настроить репликацию для повышения отказоустойчивости и реализовать механизм шардирования для равномерного распределения нагрузки.
Применить алгоритм LRU (Least Recently Used) для автоматического удаления устаревших данных. Внедрить системы мониторинга (например, Prometheus) и логирования для оперативного отслеживания состояния кеша и быстрого реагирования на возможные проблемы.
Реализация на картинке 👆🏻
#лучшее2025
🎄 С Новым Годом, будущие Java-разработчики!
Пусть в новом году все собеседования заканчиваются офферами, вопросы по многопоточности больше не пугают, а разница между HashMap и ConcurrentHashMap будет понятна на автомате 🎁
Готовьтесь к собесам вместе с нами — впереди много полезного контента! 🔥
🐸 Библиотека собеса по Java
❓ Почему Spring по умолчанию создает бины как singleton?
❌
На самом деле это исторический баг! Изначально Spring создавал новый бин для каждого запроса, но один из разработчиков забыл добавить new в цикле, и все бины стали синглтонами. Теперь это называют 'фичей' для совместимости с легаси-кодом! 🎅
Праздничный факт: Если добавить @Scope("christmas"), Spring будет создавать новый бин только 31 декабря! Идеально для сезонных акций! 🎄
✔️
Почему singleton — это дефолт:
→ Производительность: создание объекта — дорогая операция (выделение памяти, вызов конструктора, DI). Создавать бин на каждый запрос — огромные издержки.
→ Управление системными ресурсами: многие бины инкапсулируют ресурсы операционной системы или сети, которые дорого создавать и должны быть общими.
→ Естественная модель для stateless компонентов: 90%+ бизнес-логики в Spring — stateless операции. Создавать новый объект для каждого вызова бессмысленно.
→ Экономия ресурсов: один EntityManager, один RestTemplate, один connection pool
→ Кэширование: бин может безопасно кэшировать данные (если они read-only)
→ Простота жизненного цикла: @PostConstruct выполнится один раз
🐸 Библиотека собеса по Java
@spring
WANTED: JAVA-ЭКСПЕРТ
Разыскивается мастер
JVM, способный разложить по полочкам всё: от Garbage Collector до тонкостей Spring. Хватит скрывать знания за корпоративными стенами.
Приметы:
— в совершенстве знает Java (знание Go или Python будет плюсом);
— понимает, что на самом деле спрашивают на интервью в топовых компаниях;
— обладает талантом объяснять сложные темы доступным языком;
— готов качать своё медийное имя.
Условия:
— гонорар за подготовку материалов для собеседований;
— статус лидера мнений в Java-сообществе;
— методическая поддержка от команды Proglib Academy.
Явка с повинной
P.S. Знаешь Java-гуру, который засиделся в тени? Сдай его нам.💬 Обратная связь
Какие планы на новогодние праздники?
🎉 — Ем салатики и отдыхаю
🤔 — Какие праздники, буду работать
⚡️ — Буду учиться и писать пет проектики
😁 — Просто ответ, если ничего другого не подошло))
🐸 Библиотека собеса по Java
❓ Как выбрать между монолитом, модульным монолитом и микросервисами при проектировании системы?
Выбор зависит от нескольких факторов: размера команды, требований к масштабированию и сложности бизнес-логики.
🔹 Монолит подходит для MVP, стартапов и небольших команд. Все в одном приложении — проще разрабатывать, тестировать и деплоить. Минус — со временем становится сложно поддерживать из-за связанности компонентов.
🔹 Модульный монолит — это компромисс. Архитектура разбита на модули с четкими границами, но все еще в одном деплойменте. Отличный вариант, когда нужна структура микросервисов без их операционной сложности. Позволяет в будущем безболезненно выделить модули в отдельные сервисы.
🔹Микросервисы выбираем, когда есть реальная необходимость: разные части системы масштабируются по-разному, работают большие независимые команды, нужна изоляция отказов. Но это дорого — требуется инфраструктура для мониторинга, трейсинга, service discovery, обработки распределенных транзакций.
#patterns
🐸 Библиотека собеса по Java
❓ Почему нельзя использовать ArrayList в многопоточной среде?
❌
Если два потока одновременно добавят элементы, они создадут ситуацию, где список существует в двух состояниях одновременно (квантовая суперпозиция данных).
✔️
ArrayList не thread-safe, потому что все операции не синхронизированы. При concurrent доступе возникают три основные проблемы:
1. Race condition при модификации.
2. ConcurrentModificationException.
3. Нарушение инвариантов (самое опасное).
🐸 Библиотека собеса по Java
#concurrency
❓ Чем отличается процесс от потока?
Процесс — это отдельная программа, выполняющаяся в своей выделенной области памяти. У каждого процесса есть собственное адресное пространство, и он изолирован от других процессов.
Взаимодействие между процессами требует механизмов межпроцессного взаимодействия (IPC), таких как сокеты, каналы или общая память. Это делает процессы более независимыми, но обмен данными между ними — более сложным и ресурсозатратным.
Поток — это "легковесная" единица выполнения, которая работает в рамках одного процесса и использует общую память этого процесса.
В Java потоки одного процесса могут совместно использовать объекты и переменные, что значительно упрощает взаимодействие между ними по сравнению с процессами. Однако такая общая память влечет за собой риски, такие как состояния гонок и необходимость синхронизации, чтобы избежать конфликтов при одновременном доступе к ресурсам.
🐸 Библиотека собеса по Java
#concurrency
💬 Обратная связь
Какие вопросы публиковать больше?
👍🏼 — Классика с собесов, чтобы точно набить руку на ближайший
🤔 — Вопросы, которые не встречаются в каждой статье вида "N вопросов для собеса"
🔥 — Больше практики, а то одна теория
🐸 Библиотека собеса по Java
