Библиотека собеса по Java | вопросы с собеседований
Kanalga Telegram’da o‘tish
Вопросы с собеседований по Java и ответы на них. По рекламе: @tproger_sales_bot Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot
Ko'proq ko'rsatish6 456
Obunachilar
+224 soatlar
-97 kun
-1330 kun
Postlar arxiv
❓ Расскажите о паттерне Facade
Facade — это структурный паттерн, который предоставляет простой интерфейс к сложной подсистеме, скрывая внутреннюю сложность.
Простыми словами: один метод вместо десяти вызовов в разные сервисы. Пульт от телевизора — это фасад к электронике внутри.
▪️ Пример:
Оформление заказа: нужно проверить наличие, списать деньги, создать доставку, отправить уведомление. Клиент не должен знать эти детали.
// Сложная подсистема
class InventoryService {
boolean checkStock(String productId) {
return true; // проверка на складе
}
}
class PaymentService {
boolean charge(String userId, BigDecimal amount) {
return true; // списание средств
}
}
class ShippingService {
String createShipment(String orderId, String address) {
return "TRACK-" + orderId; // создание доставки
}
}
class NotificationService {
void sendOrderConfirmation(String userId, String trackingId) {
System.out.println("Уведомление отправлено: " + trackingId);
}
}
// Фасад — один метод вместо четырёх
class OrderFacade {
private final InventoryService inventory = new InventoryService();
private final PaymentService payment = new PaymentService();
private final ShippingService shipping = new ShippingService();
private final NotificationService notification = new NotificationService();
public String placeOrder(String userId, String productId,
BigDecimal amount, String address) {
if (!inventory.checkStock(productId)) {
throw new IllegalStateException("Нет на складе");
}
if (!payment.charge(userId, amount)) {
throw new IllegalStateException("Оплата не прошла");
}
String trackingId = shipping.createShipment(productId, address);
notification.sendOrderConfirmation(userId, trackingId);
return trackingId;
}
}
// Клиент вызывает один метод
OrderFacade facade = new OrderFacade();
String tracking = facade.placeOrder("user1", "SKU-100",
new BigDecimal("2999.00"), "Москва, ул. Пушкина");
▪️ Когда использовать
— Подсистема сложная, а клиенту нужен простой вход
— Хотите уменьшить связанность между слоями
— Типичный пример: сервисный слой в Spring-приложении
▪️ Минус
Фасад может стать God Object, если взять на себя слишком много логики.
🐸 Библиотека собеса по Java
#patterns😭 Как не потратить недельный лимит AI-кодинга за три дня?
Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.
🔘 Поговорим о том:
— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.
✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.
⬇️ 18 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок
💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы разберём на вебинаре.
🔗 Зарегистрироваться на вебинар
❓ Что такое "diamond problem" и как его решает Java?
«Diamond problem» возникает при множественном наследовании, когда класс может унаследовать одну и ту же реализацию от разных родителей.
В Java классы не поддерживают множественное наследование, а только интерфейсы позволяют такое. Если два интерфейса имеют одинаковый default-метод, то компилятор потребует явного переопределения в классе. Это и есть решение проблемы.
🐸 Библиотека собеса по Java
#tests
Repost from Proglib.academy | IT-курсы
👅 Самое сложное — выбрать не курс, а направление
Сегодня хочется разобраться в AI-агентах. Через пару недель появляется задача, где нужны алгоритмы. Потом понимаешь, что неплохо бы освежить Python или математику для Data Science.
🔜 Именно поэтому подписка на обучение многим оказывается удобнее отдельных курсов. Можно спокойно переключаться между темами, когда меняются задачи, а не покупать новую программу каждый раз.
В подписку Proglib Academy входят все основные направления — AI, ML, Python, алгоритмы, математика для DS и другие курсы, а ещё закрытый видеохаб с вебинарами практиков.Начать можно с пробного месяца. Если решите остаться, его стоимость зачтётся при оформлении подписки 😎 🔗 Узнать подробнее 🏃♀️ Proglib Academy
Один доступ вместо вечного выбора между «нужно для работы» и «давно хотелось изучить» 👇
❓ Как работает ConcurrentHashMap?
ConcurrentHashMap использует сегментирование / распространённые блокировки (в новых версиях — на уровне бакета), что позволяет нескольким потокам читать и писать без полной блокировки карты. Операции get делаются без блокировки, put и remove используют ограниченную блокировку (или CAS) лишь на отдельных сегментах или узлах.
В отличие от Collections.synchronizedMap(...), который блокирует весь объект на каждую операцию, ConcurrentHashMap даёт более высокую конкурентность и масштабируемость.
🐸 Библиотека собеса по Java
#concurrency
❓ Что такое нагрузочное тестирование?
Нагрузочное тестирование — это проверка поведения системы под различными уровнями нагрузки. Цель — понять, как приложение работает при большом количестве одновременных пользователей или запросов.
Обычно проверяем:
— время отклика при росте нагрузки
— максимальное количество пользователей, которое система выдерживает
— точку деградации производительности
— стабильность при длительной работе
Используем инструменты типа JMeter, Gatling или K6.
🐸 Библиотека собеса по Java
#tests
Repost from Proglib.academy | IT-курсы
🎯 У разработчика, DevOps-инженера и техлида разные причины задуматься о системной работе с AI-агентами
Но цель одна: перейти от случайных удачных запусков к управляемому процессу на реальном проекте — с понятными правилами, ревью, контролем расходов и безопасности ✔️
На курсе «ИИ для разработчиков» участники выстраивают такой процесс на практике: подключают инструменты, задают границы для агента и учатся понимать, где ему можно доверять работу, а где требуется проверка.
⚡️ Предзапись на осенний поток уже открыта
🏃♀️ Proglib Academy
Разработчику нужен стабильный результат, DevOps — контроль инфраструктуры, техлиду — правила для всей команды. Собрали это в одном посте 👇
❓ Что такое @Qualifier и когда его использовать?
@Qualifier используется для разрешения конфликтов при внедрении зависимостей, когда существует несколько бинов одного типа.
Без @Qualifier Spring не знает, какой бин внедрить, и выбросит NoUniqueBeanDefinitionException.
@Bean
@Qualifier("primary")
public DataSource primaryDB() { ... }
@Bean
@Qualifier("secondary")
public DataSource secondaryDB() { ... }
@Autowired
@Qualifier("primary")
private DataSource dataSource;
Альтернатива — использовать @Primary для бина по умолчанию.
🐸 Библиотека собеса по Java
#spring❓ Для чего используется ключевое слово this?
this — это ссылка на текущий объект внутри его метода или конструктора. Оно нужно для:
— Разрешения конфликта имён (например, между полем класса и параметром метода).
— Вызова других конструкторов этого же класса.
— Передачи текущего объекта в качестве аргумента в методы или конструкторы других классов.
— Возврата ссылки на текущий объект (часто используется в паттерне Builder или для чейнинга методов).
🐸 Библиотека собеса по Java
#core
❓ Разница между Statement и PreparedStatement?
— Statement используется для выполнения простых SQL-запросов без параметров. Он формирует запрос как строку и каждый раз компилирует его заново, что может быть медленно и небезопасно.
— PreparedStatement предварительно компилируется базой данных и позволяет задавать параметры через плейсхолдеры. Что повышает производительность при многократном выполнении одного запроса и защищает от SQL-инъекций (данные не конкатенируются со строкой запроса, а подставляются корректно).
Поэтому в реальных проектах почти всегда используют PreparedStatement.
🐸 Библиотека собеса по Java
#core
Repost from Proglib.academy | IT-курсы
У вас в проекте есть файл вроде utils_v2_final_FIX.py, который все боятся трогать ❓
Что делаете с таким легаси?
❤️ Не трогаю: работает — и ладно
👍 Переписываю с нуля и надеюсь на лучшее
🔥 Сначала покрываю тестами, потом рефакторю по частям
👾 У нас такого нет — честно-честно
На курсе «ИИ для разработчиков» разберём третий подход: как с помощью агента зафиксировать текущее поведение легаси-кода тестами, а затем менять его небольшими безопасными шагами — без одного огромного PR на тысячу файлов.
До 31 июля действует скидка и бессрочный доступ к материалам.
🔗 Занять место со скидкой
🏃♀️ Proglib Academy
Когда название файла уже само по себе считается техническим долгом 👇
❓ Как работает HashMap внутри? Что происходит при коллизии и при достижении load factor?
HashMap — массив бакетов (Node[] table). Ключ хешируется, хеш определяет индекс бакета: index = hash & (capacity - 1
Что происходит при put(key, value):
Считается hash(key) — не просто hashCode(), а с дополнительным перемешиванием старших битов ((h = key.hashCode()) ^ (h >>> 16)). Это снижает коллизии при маленьком размере таблицы.
Находится бакет по индексу. Если пустой — кладём первым. Если нет — коллизия.
🔹 Коллизия:
До Java 8 → связный список в бакете. Поиск O(n) в худшем случае.
С Java 8 → когда в бакете больше 8 элементов и capacity >= 64, список превращается в красно-чёрное дерево. Поиск становится O(log n). Обратно в список — при сжатии ниже 6 элементов.
// Упрощённо: Node в списке или TreeNode в дереве
static class Node<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
}
🔹 Load factor и resize:
По умолчанию capacity = 16, loadFactor = 0.75. Порог = capacity * loadFactor = 12.
Как только элементов стало больше 12 — начинается resize(): таблица удваивается до 32, все элементы перераспределяются по новым бакетам. Это O(n) операция.
Поэтому если заранее знаете размер — задавайте начальную ёмкость:
// Хотим 1000 элементов без resize:
// 1000 / 0.75 ≈ 1334, берём следующую степень двойки
Map<String, Integer> map = new HashMap<>(2048);
🐸 Библиотека собеса по Java
#core✔️ Java-тест: ретраи с экспоненциальной задержкой
Напишите production-ready ретраер 👇
📦 Задание
Реализуйте утилиту, которая повторяет операцию при временном сбое:
public <T> T executeWithRetry(Supplier<T> operation) {
// Ваша реализация
}
📋 Требования
— Максимум N попыток.
— Экспоненциальная задержка: 100ms → 200ms → 400ms… с верхней границей (cap).
— Добавить jitter (случайный разброс), чтобы избежать «thundering herd» при массовых ретраях.
— Ретраить только временные ошибки, бизнес-ошибки пробрасывать сразу.
— Корректно обработать прерывание (InterruptedException + восстановление флага interrupt).
— После исчерпания попыток пробросить последнее исключение (с сохранением причины).
Ставьте → 🔥, если нравится формат. Если нет → 🌚
💬 Решения под спойлер. Сравним, какое будет лучше.
🐸Библиотека собеса по Java
#practise✔️ Java-тест: ретраи с экспоненциальной задержкой
Напишите production-ready ретраер 👇
📦 Задание
Реализуйте утилиту, которая повторяет операцию при временном сбое:
public <T> T executeWithRetry(Supplier<T> operation) {
// Ваша реализация
}
📋 Требования
— Максимум N попыток.
— Экспоненциальная задержка: 100ms → 200ms → 400ms… с верхней границей (cap).
— Добавить jitter (случайный разброс), чтобы избежать «thundering herd» при массовых ретраях.
— Ретраить только временные ошибки, бизнес-ошибки пробрасывать сразу.
— Корректно обработать прерывание (InterruptedException + восстановление флага interrupt).
— После исчерпания попыток пробросить последнее исключение (с сохранением причины).
Ставьте → 🔥, если нравится формат. Если нет → 🌚
💬 Решения под спойлер. Сравним, какое будет лучше.
🐸Библиотека собеса по Java
#practise✔️ Java-тест: ретраи с экспоненциальной задержкой
Напишите production-ready ретраер 👇
📦 Задание
Реализуйте утилиту, которая повторяет операцию при временном сбое:
public <T> T executeWithRetry(Supplier<T> operation) {
// Ваша реализация
}
📋 Требования
— Максимум N попыток.
— Экспоненциальная задержка: 100ms → 200ms → 400ms… с верхней границей (cap).
— Добавить jitter (случайный разброс), чтобы избежать «thundering herd» при массовых ретраях.
— Ретраить только временные ошибки, бизнес-ошибки пробрасывать сразу.
— Корректно обработать прерывание (InterruptedException + восстановление флага interrupt).
— После исчерпания попыток пробросить последнее исключение (с сохранением причины).
Ставьте → 🔥, если нравится формат. Если нет → 🌚
💬 Решения под спойлер. Сравним, какое будет лучше.
🐸 Библиотека собеса по Java
#practiseRepost from Proglib.academy | IT-курсы
📈 Скоро фраза «умею пользоваться AI» в резюме будет звучать так же странно, как сегодня «умею пользоваться Git»
Это просто станет частью профессии. А вот умение встроить AI в процесс разработки так, чтобы он действительно ускорял работу команды, останется конкурентным преимуществом 💡
🔜 На курсе «ИИ для разработчиков» участники работают со своими проектами и учатся делать AI частью ежедневной разработки: планировать задачи, писать код, проверять изменения, готовить PR и автоматизировать рутину.
До конца июля действует специальная цена — 59 990 ₽ вместо 79 990 ₽ 🥳 И получить бессрочный доступ ко всем материалам курса.
🔗 Посмотреть, как устроен курс
🏃♀️ Proglib Academy
🥳 До конца июля сохраняются две приятные вещи: специальная цена и бессрочный доступ к материалам курса. Подробнее — в посте 👇
