Библиотека собеса по Java | вопросы с собеседований
Open in Telegram
Вопросы с собеседований по Java и ответы на них. По рекламе: @tproger_sales_bot Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot
Show more6 375
Subscribers
-324 hours
-237 days
-5530 days
Posts Archive
🤖 Раньше в AI мог попасть любой, кто осилил пару туториалов.
Теперь нужны те, кто может объяснить:
→ почему эта архитектура сработает, а та — нет;
→ что происходит внутри модели, когда она не сходится;
→ как найти решение, а не перебирать гиперпараметры наугад.
Все эти навыки требуют понимания того, как и почему работают модели. А это чистая математика.
🔥 Proglib Academy запускает курс «Математика для разработки AI-моделей». Ведут эксперты из SberAI, ВШЭ, Т-Банк, Wildberries.
📝 Что внутри?
→ 2 месяца живых занятий с возможностью задавать вопросы напрямую.
→ Практика на Python. Не теория в вакууме, а применение.
→ 3 домашних задания + финальный проект с детальным разбором.
⏰ Старт 4 декабря
⌛ Только до конца ноября:
→ Скидка 40%;
→ Курс «Школьная математика» в подарок;
→ Тест на определение уровня математики.
🎄 Сделай себе подарок на Новый год
❓ Расскажите о паттерне Prototype
Prototype — это порождающий паттерн, который позволяет копировать объекты, не вдаваясь в подробности их реализации.
Простыми словами: вместо создания объекта с нуля через конструктор, вы клонируете уже существующий экземпляр.
▪️ Пример:
Система отчетов, где базовая конфигурация отчета сложная (подключение к БД, загрузка шаблонов, настройка форматирования). Вместо каждый раз создавать отчет заново, клонируем прототип.
// Прототип abstract class Report implements Cloneable { protected String template; protected DatabaseConnection dbConnection; protected Map<String, Object> settings; // Сложная инициализация public Report() { this.dbConnection = new DatabaseConnection(); // затратная операция this.settings = loadDefaultSettings(); // загрузка из файла } @Override public Report clone() { try { Report cloned = (Report) super.clone(); // Глубокое копирование для изменяемых полей cloned.settings = new HashMap<>(this.settings); return cloned; } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } abstract void generate(); } class SalesReport extends Report { void generate() { System.out.println("Генерация отчета по продажам"); } } // Использование Report prototype = new SalesReport(); // долгая инициализация // Быстрое создание копий Report report1 = prototype.clone(); Report report2 = prototype.clone(); report2.settings.put("period", "Q2"); // изменяем только нужные параметры▪️ Когда использовать — Создание объекта затратно (сложная инициализация, обращение к БД, парсинг файлов) — Нужно избежать привязки к конкретным классам при создании копий — Объекты различаются только состоянием, а не поведением ▪️ Важно: Shallow vs Deep Copy Shallow copy — копируются только примитивы, ссылки на объекты остаются теми же Deep copy — создаются копии вложенных объектов ▪️ Альтернативы clone() — Copy constructor: new Report(original) — Статический метод: Report.copy(original) — Сериализация: для очень сложных объектов ▪️ Минус Клонирование объектов с циклическими ссылками может быть сложным. 🐸 Библиотека собеса по Java #patterns
❓ Расскажите о паттерне Abstract Factory
Abstract Factory — это порождающий паттерн, который создает семейства связанных объектов без привязки к конкретным классам.
Простыми словами: вы создаете не один объект, а целый набор совместимых между собой объектов.
▪️ Пример:
Система уведомлений, которая работает с разными провайдерами (AWS, Firebase). Для каждого провайдера нужны свои клиенты для отправки email, SMS и push-уведомлений.
// Абстрактные продукты interface EmailSender { void send(String to, String message); } interface SmsSender { void send(String phone, String message); } // Абстрактная фабрика interface NotificationFactory { EmailSender createEmailSender(); SmsSender createSmsSender(); } // AWS реализация class AwsEmailSender implements EmailSender { public void send(String to, String message) { System.out.println("Отправка через AWS SES: " + to); } } class AwsSmsSender implements SmsSender { public void send(String phone, String message) { System.out.println("Отправка через AWS SNS: " + phone); } } class AwsNotificationFactory implements NotificationFactory { public EmailSender createEmailSender() { return new AwsEmailSender(); } public SmsSender createSmsSender() { return new AwsSmsSender(); } } // Аналогично FirebaseNotificationFactory... // Использование NotificationFactory factory = new AwsNotificationFactory(); EmailSender email = factory.createEmailSender(); SmsSender sms = factory.createSmsSender(); // Гарантия: оба сервиса работают через AWS▪️ В чем отличие от Factory Method — Factory Method создает один продукт — Abstract Factory создает семейство продуктов (email + sms + push) ▪️ Когда использовать Когда нужны наборы связанных объектов, которые должны работать вместе (клиенты для разных облаков, драйверы БД, парсеры форматов). ▪️ Минус Сложно добавить новый тип продукта — придется менять все фабрики. 🐸 Библиотека собеса по Java #patterns
💬 Обратная связь
Моё отношение к постам:
🔥 — Интересно, полезно
🤔 — Нейтрально
😁 — Не понравилось, напишу что
🐸 Библиотека собеса по Java
❓ Расскажите о паттерне Factory Method
Factory Method — порождающий паттерн, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
🔹 Когда использовать:
Когда заранее неизвестны типы и зависимости объектов, или когда нужно делегировать создание объектов подклассам.
🔹 Как работает:
Создается абстрактный метод для создания объектов, а конкретные подклассы переопределяют его, возвращая нужные типы.
🔹 Плюсы:
— избавляет от привязки к конкретным классам;
— упрощает добавление новых типов продуктов;
— следует Open/Closed Principle.
🐸 Библиотека собеса по Java
#core
❓ Расскажите о паттерне Adapter
Adapter (Адаптер) — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он выступает в роли "переходника" между двумя интерфейсами.
🔹 Когда использовать:
Когда нужно использовать существующий класс, но его интерфейс не соответствует требуемому. Например, при интеграции сторонних библиотек или работе с легаси-кодом.
🐸 Библиотека собеса по Java
#core
❓ Расскажите про паттерн Singleton?
Singleton — это порождающий паттерн проектирования, который гарантирует, что у класса существует только один экземпляр, и предоставляет глобальную точку доступа к нему.
🔹 Основные характеристики:
— приватный конструктор запрещает создание экземпляров извне;
— статический метод getInstance() возвращает единственный экземпляр;
— статическое поле для хранения экземпляра.
🔹 Когда использовать:
— объект содержит глобальное состояние;
— создание объекта ресурсозатратно;
— нужен единый координатор действий;
— логически должен быть один экземпляр.
🐸 Библиотека собеса по Java
#core
🔥 Закрой пробелы в математике за 8 недель
Валишься на вопросах про математику на собесах?
Proglib Academy запускает курс «Математика для Data Science», чтобы помочь тебе получить вакансию мечты!
🔎 Тебя ждут:
→ топовые эксперты, один из них на видео — Мария Тихонова. Мария — кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ;
→ живые вебинары, на которых можно задать вопросы спикерам;
→ доступ к материалам в записи, если не успели на лекцию и чат;
→ 3 задания с практикой на Python и финальный проект с подробной обратной связью от экспертов курса;
→ актуальные знания: программа разработана в ноябре 2025г;
→ программа без воды — 2 месяца только самого нужного для старта.
👉 Пройди короткий тест и узнай свой уровень математики.
Приятные бонусы:
🎁 скидка 40% до 30 ноября;
🎁 оплати до конца ноября → курс «Школьная математика» в подарок.
🔗 Подробнее о курсе
❓ Расскажите про паттерн Strategy?
Strategy — это поведенческий паттерн, который позволяет определить семейство алгоритмов, инкапсулировать каждый из них и сделать их взаимозаменяемыми.
Когда использовать:
— есть несколько способов выполнения одной операции;
— нужно избежать множественных if-else или switch;
— алгоритмы должны выбираться в runtime.
Преимущества: соблюдение Open/Closed Principle, устранение условных операторов, гибкость выбора алгоритма.
🐸 Библиотека собеса по Java
#core
❓ Гарантирует ли ExecutorService корректное завершение всех задач, если вызвать shutdown()?
Нет, shutdown() не гарантирует корректное завершение всех задач.
🔹 shutdown() делает следующее:
— запрещает принимать новые задачи;
— позволяет завершиться уже запущенным и ожидающим задачам;
— возвращает управление сразу же, не дожидаясь завершения.
🐸 Библиотека собеса по Java
#concurrency
✔️ Java-тест: Config edition
Представим задачу 👇
У вас есть Spring Boot-приложение с PostgreSQL. Нужно написать конфиг application.yml, который:
— настраивает подключение к БД (host: localhost, port: 5432, database: app_db);
— включает Hibernate DDL auto-update в dev-режиме;
— настраивает логирование SQL-запросов;
— устанавливает максимальный размер пула соединений = 10.
💬 Решения под спойлер. Сравним, какое будет лучше.
🐸 Библиотека собеса по Java
#practise
❓ В чём разница между @Transactional на уровне класса и на уровне метода?
@Transactional на классе задаёт поведение по умолчанию для всех его публичных методов.
Аннотация на методе переопределяет настройки класса и всегда имеет более высокий приоритет.
🐸 Библиотека собеса по Java
#spring
💬 Обратная связь
Ежемесячный опрос по грейдам. Растём вместе 💪🏻
Ваш грейд:
🔥 — Senior
👍🏼 — Middle
❤️ — Junior
😁 — Ещё учусь
🐸 Библиотека собеса по Java
❓ Что такое Spring Profiles и зачем они нужны?
Spring Profiles — это механизм в Spring, который позволяет разделять конфигурации приложения по окружениям. Например: dev, test, prod.
С их помощью можно активировать нужные бины и настройки в зависимости от среды, не меняя код.
Типичный пример — разные параметры подключения к БД или API-ключи.
Профиль можно указать:
— в application.properties (spring.profiles.active=dev);
— через аргументы JVM (-Dspring.profiles.active=prod);
— или переменные окружения.
Это обеспечивает чистое разделение конфигураций и снижает риск ошибок при деплое.
🐸 Библиотека собеса по Java
#spring
❓ Какие бывают гарантии доставки сообщений в 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
🖤 ЧЕРНАЯ ПЯТНИЦА: СКИДКА 40%
Что общего между Black Friday и подготовкой к собесам? Оба случаются раз в год, и оба нельзя пропустить! 😎
🔥 Курсы со скидкой 40% до конца ноября:
🐍 Python
📐 Математика
🤖 AI
🔢 Алгоритмы и структуры
Пока другие покупают кофемашины и телевизоры, инвестируй в себя📈
❓ Что такое статическое и динамическое связывание?
🔹 Статическое связывание (или раннее связывание) — это связывание метода с его вызовом на этапе компиляции. Используется для:
— static методов;
— private методов;
— final методов;
— перегруженных методов (overloading).
Решение принимается на основе типа ссылки.
🔹 Динамическое связывание (или позднее связывание) — это связывание метода с его вызовом во время выполнения программы (runtime). Используется для:
— переопределенных методов (overriding);
— реализации полиморфизма.
Решение принимается на основе фактического типа объекта.
🐸 Библиотека собеса по Java
#core
✔️ Java-тест: Безопасное извлечение значений из Map
Напишите метод для production-кода 👇
📦 Задание
Реализуйте метод для безопасного получения значения из вложенной Map с default-значением:
public class MapUtils {
public static <T> T getNestedValue(Map<String, Object> map,
String path,
T defaultValue) {
// Ваша реализация
}
}
Требования
— Путь задается через точку: "user.address.city"
— Если любой уровень вложенности null или отсутствует → вернуть defaultValue
— Обработать пустой путь → вернуть defaultValue
— Обработать null в параметрах → вернуть defaultValue
Примеры использования
Map<String, Object> data = Map.of( "user", Map.of( "name", "John", "age", 30, "address", Map.of( "city", "Moscow" ) ) ); String city = getNestedValue(data, "user.address.city", "Unknown"); // → "Moscow" Integer age = getNestedValue(data, "user.age", 0); // → 30 String country = getNestedValue(data, "user.address.country", "Russia"); // → "Russia" (не найдено)Ставьте → 🔥, если нравится формат. Если нет → 🤔 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise
❓ Что такое нагрузочное тестирование?
Нагрузочное тестирование — это проверка поведения системы под различными уровнями нагрузки. Цель — понять, как приложение работает при большом количестве одновременных пользователей или запросов.
Обычно проверяем:
— время отклика при росте нагрузки
— максимальное количество пользователей, которое система выдерживает
— точку деградации производительности
— стабильность при длительной работе
Используем инструменты типа JMeter, Gatling или K6.
🐸 Библиотека собеса по Java
#tests
💬 Обратная связь
Хештег с темой вопроса:
🔥 — Супер, удобно
😁 — Неудобно, верните как было
🐸 Библиотека собеса по Java
