Библиотека собеса по Java | вопросы с собеседований
رفتن به کانال در Telegram
Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/08c603b6 Для обратной связи: @proglibrary_feeedback_bot
نمایش بیشتر6 487
مشترکین
+524 ساعت
+147 روز
+1430 روز
آرشیو پست ها
❓ Что делает метод flatMap() в Stream API?
flatMap() преобразует каждый элемент в Stream и объединяет все Stream'ы в один плоский Stream. В отличие от map() возвращает Stream<T>.
Полезен для работы с вложенными коллекциями или когда операция возвращает Optional/Stream.
🐸 Библиотека собеса по Java
#core
❓ В чём разница между @Component, @Service и @Repository?
Технически — никакой. Все три создают Spring bean и работают одинаково.
Разница семантическая:
→ @Component — общий стереотип для любого компонента.
→ @Service — для бизнес-логики (service layer).
→ @Repository — для работы с данными (DAO layer).
@Repository имеет дополнительную функцию: перехватывает специфичные для persistence исключения и переводит их в DataAccessException.
Использование правильной аннотации улучшает читаемость и показывает роль класса в архитектуре.
🐸 Библиотека собеса по Java
#spring
❓ Что такое паттерн Flyweight и где он используется в Java?
Flyweight — это паттерн для экономии памяти путём переиспользования объектов с одинаковым состоянием.
Объект разделяется на intrinsic state (неизменяемое, общее) и extrinsic state (изменяемое, уникальное). Общее состояние хранится в одном экземпляре.
🔹 Примеры:
— String Pool (все одинаковые строки ссылаются на один объект)
— Integer.valueOf() кеширует числа от -128 до 127
— Boolean.TRUE и Boolean.FALSE
Паттерн эффективен, когда создаётся много объектов с повторяющимися данными.
🐸 Библиотека собеса по Java
#patterns
❓ Чем отличается invokeAll() от submit() в ExecutorService?
→ submit() отправляет одну задачу и сразу возвращает Future. Задача выполняется асинхронно.
→ invokeAll() принимает коллекцию задач и блокирует поток до завершения всех задач. Возвращает список Future только когда все задачи выполнены или вышел таймаут.
🐸 Библиотека собеса по Java
#concurrency
❓ В чём разница между CopyOnWriteArrayList и Collections.synchronizedList()?
CopyOnWriteArrayList создаёт копию массива при каждой модификации. Чтение не блокируется вообще, подходит для случаев, когда чтений много, а записей мало.
Collections.synchronizedList() оборачивает обычный List и синхронизирует каждый метод через монитор. Все операции (и чтение, и запись) блокируются.
🐸 Библиотека собеса по Java
#concurrency
❓ Можно ли переопределить статический метод?
Нет, статические методы не переопределяются (override), они скрываются (hide).
При вызове статического метода решение о том, какой метод выполнить, принимается на этапе компиляции по типу ссылки, а не по типу объекта.
class Parent {
static void test() { System.out.println("Parent"); }
}
class Child extends Parent {
static void test() { System.out.println("Child"); }
}
Parent obj = new Child();
obj.test(); // Выведет "Parent"
Статические методы принадлежат классу, а не объекту, поэтому полиморфизм на них не работает.
🐸 Библиотека собеса по Java
#core«Этот манёвр будет стоить нам 51 год...»
— или проваленный тех-скрининг из-за незнания паттернов проектирования. В
Java энтерпрайзе архитектура — это всё. Не ждите, пока гравитация рынка прижмёт вас к зарплатному потолку, вкачивайте базу.
С понедельника цены в Proglib Academy станут выше. Забирайте профессиональное обучение сейчас:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Стать сильнее на интервью
⚠️ Цены вырастут 19 января❓ Что такое 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
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
