Библиотека собеса по Java | вопросы с собеседований
الذهاب إلى القناة على Telegram
Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/08c603b6 Для обратной связи: @proglibrary_feeedback_bot
إظهار المزيد6 487
المشتركون
+524 ساعات
+147 أيام
+1430 أيام
أرشيف المشاركات
🎄 С Новым Годом, будущие 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
✔️ Collections Challenge: Реализация Custom HashMap
Напишите упрощённую версию HashMap с нуля 👇
📦 Задание
Реализуйте SimpleHashMap<K, V> — собственную реализацию хеш-таблицы без использования готовых Map.
📋 Требования
1. Основная функциональность
→ put() — добавить/обновить пару ключ-значение
→ get() — получить значение по ключу (null если нет)
→ remove() — удалить элемент, вернуть старое значение
→ containsKey() — проверка наличия ключа
→ size() — текущее количество элементов
→ keySet() — множество всех ключей
2. Внутренняя структура
→ Использовать массив buckets (корзин)
→ Collision resolution через связный список (chaining)
→ Начальная ёмкость — 16 элементов
→ Load factor — 0.75
3. Обязательные фичи
→ Автоматическое расширение (resize) при превышении load factor
→ Корректная работа с null ключами
→ Правильный расчёт hashCode (учитывать equals/hashCode contract)
→ Обработка коллизий
Ставьте → 🔥, если нравится формат. Если нет → 🤔
💬 Пишите решение в комментариях, главное прячьте под спойлер.
🐸 Библиотека собеса по Java
#practise
❓ Где лучше хранить пароль: в строке или в массиве символов?
Пароль лучше хранить в массиве символов.
— Строки в Java неизменяемы, и их нельзя явно удалить из памяти. Они остаются там до сборки мусора, что может привести к утечке пароля.
— Массив можно очистить вручную после использования (путём перезаписи значения), что даёт больший контроль над временем хранения данных.
🐸 Библиотека собеса по Java
#core
❓ В чем разница между fail-fast и fail-safe итераторами?
❌
Fail-fast итераторы — это те, которые быстро падают при первой же ошибке, потому что написаны на скорострельном C++. А fail-safe итераторы работают медленно, зато безопасно, потому что каждый элемент проверяется антивирусом перед возвратом.
✔️
🔹 Fail-fast итераторы:
→ Бросают ConcurrentModificationException при структурном изменении коллекции во время итерации.
→ Проверяют modCount (счетчик модификаций) при каждом вызове next().
→ Используются в большинстве коллекций из java.util (ArrayList, HashMap, HashSet).
→ Работают на оригинальной коллекции.
🔹 Fail-safe итераторы:
→ Работают на копии/снимке коллекции, поэтому не бросают исключений.
→ Используются в java.util.concurrent коллекциях (CopyOnWriteArrayList, ConcurrentHashMap).
→ Могут не отражать актуальное состояние коллекции (weakly consistent).
→ Потребляют больше памяти из-за копирования.
🐸 Библиотека собеса по Java
#core
❓ Почему нельзя использовать LocalDateTime для работы с временными метками в распределенных системах?
❌
Потому что LocalDateTime — это местное время, а в распределенных системах все серверы находятся в разных городах! Если один сервер в Москве показывает 15:00, а другой в Владивостоке — 22:00, то база данных не знает, как решить противоречия.
✔️
LocalDateTime не хранит информацию о часовом поясе и смещении относительно UTC, что делает его непригодным для распределенных систем
🐸 Библиотека собеса по Java
#core
❓ Для чего нужна HashMap?
❌
HashMap нужна исключительно для того, чтобы было что спросить на собеседовании. Без неё интервьюеры бы не знали, как отсеивать кандидатов.
✔️
HashMap — это реализация структуры данных hash table, которая обеспечивает быстрый доступ, вставку и удаление элементов по ключу в среднем за O(1).
Основные сценарии использования:
1️⃣ Кеширование и мемоизация — когда нужен быстрый доступ к часто используемым данным.
2️⃣ Подсчет частоты элементов — классическая задача с O(n) сложностью.
3️⃣ Индексация для быстрого поиска — когда нужно избежать линейного перебора.
🐸 Библиотека собеса по Java
#core
Spring — это не вся Java
На собеседованиях любят гонять по «кишкам» языка, конкурентности и алгоритмам. Если ты знаешь только фреймворк, шаг влево-вправо грозит провалом.
Новогодняя акция 1 + 2:
Покупаешь один курс, получаешь три. Оплачивается только позиция с максимальным чеком.
Java-набор:
— Алгоритмы и структуры данных (база Enterprise);
— Архитектуры и шаблоны проектирования.
Подготовиться к офферу
Актуально до 31 декабря.
Нужен совет? @manager_proglib
💬 Обратная связь
Добавили немного юмора к постам. Мнение:
😁 — Забавно, пусть будет
👍🏼 — Нейтрально
🤔 — Неудобно, только отвлекает от сути
🐸 Библиотека собеса по Java
✔️ Concurrency-тест: Реализация Thread-Safe Cache
Напишите потокобезопасный кеш с TTL и размером 👇
📦 Задание
Реализуйте ExpiringCache<K, V> — thread-safe кеш с автоматическим удалением устаревших записей.
public class ExpiringCache<K, V> {
public void put(K key, V value, Duration ttl) { }
public Optional<V> get(K key) { }
public void remove(K key) { }
public int size() { }
}
📋 Требования
1. Функциональность
put() — добавить элемент с TTL (time-to-live)
get() — получить элемент, вернуть Optional.empty() если истёк
remove() — удалить элемент
size() — количество валидных (не истёкших) элементов
2. Потокобезопасность
→ Все операции должны быть thread-safe
→ Минимизировать блокировки (не использовать synchronized на весь объект)
→ Одновременное чтение не должно блокироваться
— Производительность
→ get() должен быть O(1) в среднем случае
→ Автоматическая очистка истёкших записей (passive + active eviction)
→ Не создавать отдельный поток для каждого элемента
3. Ограничения
→ Максимальный размер кеша — 1000 элементов
→ При превышении удалять самые старые записи (LRU)
→ Graceful shutdown при закрытии кеша
Бонус: Добавить метрики (cache hits/misses)
Ставьте → 🔥, если нравится формат. Если нет → 🤔
💬 Пишите решение в комментариях, главное прячьте под спойлер.
🐸 Библиотека собеса по Java
#practise❓ Почему String неизменяемый (immutable)?
❌
Потому что StringBuilder — это String для продакшена, а String — только для учебы!
✔️
Основные причины:
1️⃣ String Pool — переиспользование объектов экономит память
2️⃣ Безопасность — используется в критичных местах
3️⃣ Потокобезопасность — можно свободно шарить между потоками без синхронизации
4️⃣ Хеш-код кешируется — ускоряет работу HashMap/HashSet
🐸 Библиотека собеса по Java
#core
❓ Что такое false sharing в многопоточности Java и как его избежать?
False sharing возникает, когда разные потоки обновляют разные переменные, находящиеся в одной кэш-линии CPU.
Несмотря на отсутствие логической связи, процессор вынужден постоянно инвалидировать кэш, создавая задержки.
Последствия: высокая латентность, падение пропускной способности, резкое ухудшение производительности в hot-paths.
Как избежать:
• Разнести горячие поля по разным кэш-линиям → использовать @Contended (JDK 8+, требует -XX:-RestrictContended).
• Заполнять структуру “паддингом” вручную.
• Перепроектировать алгоритм, чтобы снизить частоту записи.
🐸 Библиотека собеса по Java
#concurrency
❓ Может ли интерфейс быть final?
❌
Конечно может! Более того, в Java 21 появился секретный модификатор ultra-final, после которого IDE будет ругаться на него еще до компиляции!
✔️
Интерфейс не может быть объявлен как final. Это противоречит самой природе интерфейсов — они созданы для того, чтобы их реализовывали другие классы. Модификатор final запрещает наследование/реализацию, что делает интерфейс бесполезным.
Интерфейсы по умолчанию являются abstract, что концептуально противоположно final.
🐸 Библиотека собеса по Java
#core
Spring — это хорошо, но AI — это будущее
Многие Java-разработчики хотят в ML, но спотыкаются о математику. Мы убираем этот барьер. Обновленный курс с живыми вебинарами поможет разобраться в основах.
Ваш план действий:
1. Понять базу: Векторы, матрицы, определители (лекция 2).
2. Построить модель: Линейная регрессия и МНК (лекция 3).
3. Углубиться: SVD-разложение и рекомендательные системы (лекция 4).
Практика на Python (это стандарт индустрии), но понимание алгоритмов останется с вами навсегда, на чем бы вы ни писали.
⚠️ Осталось 3 дня до закрытия набора.
Присоединиться:
https://clc.to/LojFzw
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
