Библиотека собеса по Java | вопросы с собеседований
Ir al canal en Telegram
Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot
Mostrar más6 464
Suscriptores
-124 horas
-37 días
-1130 días
Archivo de publicaciones
❓ В чём разница между throw и throws?
❌
→ throw — это когда один разработчик бросает исключение в другого
→ throws — это когда вся команда бросает код в прод без ревью.
Ключевое: чем больше 's' в конце, тем больше народу пострадает.
✔️
→ throw — это оператор, который непосредственно выбрасывает исключение в коде:
throw new IllegalArgumentException("Ошибка");
→ throws — это ключевое слово в сигнатуре метода, которое декларирует, что метод может выбросить исключение (перекладывает обработку на вызывающий код):
public void readFile() throws IOException {
// код
}
💬 Добавим немного юмора?
😁 → Да
🔥 → Нет
🐸 Библиотека собеса по Java
#core❓ В чём основное отличие Docker от виртуальной машины?
Основное отличие в уровне виртуализации.
Виртуальная машина виртуализирует железо целиком: у неё есть собственная ОС со всеми компонентами, гипервизор, ядро. Это тяжеловесно — VM может весить гигабайты и стартовать минутами.
Docker виртуализирует только уровень приложения. Контейнеры используют ядро хостовой ОС, изолируясь через namespaces и cgroups. Они легковесны — образ может весить десятки мегабайт, запускается за секунды.
🔹 На практике это означает
— Docker быстрее и экономнее по ресурсам.
— VM даёт полную изоляцию и может запускать разные ОС на одном хосте.
— Для микросервисов обычно выбирают Docker, для полной изоляции окружений — VM.
🐸 Библиотека собеса по Java
#core
❓ Расскажите о паттерне Flyweight
Flyweight — это структурный паттерн, который позволяет вместить большее количество объектов в отведённую оперативную память за счёт разделения общего состояния между объектами.
Простыми словами: вместо создания тысяч похожих объектов, вы создаёте несколько объектов-легковесов с общими данными и передаёте уникальные данные извне при использовании.
▪️ Пример
Текстовый редактор, где каждая буква — это объект. Если создавать отдельный объект для каждой буквы с полным набором свойств (шрифт, размер, цвет), миллион символов займут гигабайты памяти.
// Flyweight — легковес с общим состоянием class CharacterStyle { private final String font; // внутреннее состояние private final int size; // (intrinsic) private final String color; public CharacterStyle(String font, int size, String color) { this.font = font; this.size = size; this.color = color; } public void render(char character, int x, int y) { // внешнее состояние System.out.println("Рендер '" + character + "' в позиции (" + x + "," + y + ")"); } } // Фабрика для переиспользования flyweight-объектов class StyleFactory { private Map<String, CharacterStyle> styles = new HashMap<>(); public CharacterStyle getStyle(String font, int size, String color) { String key = font + size + color; return styles.computeIfAbsent(key, k -> new CharacterStyle(font, size, color)); } } // Использование StyleFactory factory = new StyleFactory(); // Миллион символов используют всего несколько объектов стилей CharacterStyle arial12 = factory.getStyle("Arial", 12, "black"); arial12.render('H', 0, 0); arial12.render('e', 10, 0); arial12.render('l', 20, 0); arial12.render('l', 30, 0); arial12.render('o', 40, 0);▪️ Когда использовать — Приложение создаёт огромное количество однотипных объектов — Объекты потребляют много памяти — Большую часть состояния можно вынести за пределы объекта — Приложение не зависит от идентичности объектов (можно переиспользовать) ▪️ Минусы — Усложнение кода из-за разделения состояния — Flyweight должен быть immutable для безопасного переиспользования 🐸 Библиотека собеса по Java #patterns
✔️ SQL-тест: Поиск дубликатов транзакций
Напишите запрос для production-базы 👇
📦 Задание
Есть таблица transactions с полями:
id — идентификатор
user_id — ID пользователя
amount — сумма транзакции
created_at — время создания
Найдите подозрительные дубликаты: транзакции одного пользователя с одинаковой суммой, созданные в течение 5 минут друг от друга.
📋 Требования
— Вывести: user_id, amount, количество дублей, временной диапазон
— Показать только группы с 2+ транзакциями
— Отсортировать по количеству дублей (DESC)
Ставьте → 🔥, если нравится формат. Если нет → 🤔
💬 Пишите решение в комментариях, главное прячьте под спойлер.
🐸 Библиотека собеса по Java
#practise
🤖 Раньше в 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
🔢 Алгоритмы и структуры
Пока другие покупают кофемашины и телевизоры, инвестируй в себя📈
