ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك

Библиотека собеса по Java | вопросы с собеседований

Библиотека собеса по Java | вопросы с собеседований

الذهاب إلى القناة على Telegram

Вопросы с собеседований по Java и ответы на них. По рекламе: @tproger_sales_bot Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot

إظهار المزيد
6 378
المشتركون
-624 ساعات
-197 أيام
-5130 أيام
أرشيف المشاركات
❓ Опишите жизненный цикл бина в Spring Основные этапы: 1. Создание экземпляра (вызов конструктора). 2. Внедрение зависимостей (поля/сеттеры). 3. Вызов Aware-интерфейсов (BeanNameAware, ApplicationContextAware и т. д.). 4. BeanPostProcessor.postProcessBeforeInitialization. 5. @PostConstruct. 6. afterPropertiesSet() (InitializingBean), затем кастомный init-метод. 7. BeanPostProcessor.postProcessAfterInitialization — здесь навешиваются прокси (AOP, @Transactional). 8. Бин готов к использованию. При завершении контекста: @PreDestroy → destroy() (DisposableBean) → кастомный destroy-метод. 🐸 Библиотека собеса по Java #spring

💻 3 курса по цене одного — собери стек для оффера в топовую IT-компанию Для следующего карьерного шага мало писать код. Рабо
💻 3 курса по цене одного — собери стек для оффера в топовую IT-компанию Для следующего карьерного шага мало писать код. Работодатели ждут не только знания языка, но и понимания архитектуры, алгоритмов, автоматизации, AI-инструментов и агентных систем. Одно направление закрывает только часть задачи. Поэтому сейчас мы предлагаем освоить сразу несколько востребованных навыков — выбери любой курс и получи доступ еще к двум бесплатно 🔥 Собери стек навыков под свою цель: 🔹 подготовка к сильным компаниям (алгоритмы, архитектура); 🔹 переход в AI-направление (ИИ-агенты, AgentOps); 🔹 развитие в ML и Data Science (математика, основы ML); 🔹 новый оффер и рост дохода. Полученные знания применяешь в работе уже во время обучения. ⏳ Акция действует 48 часов — 13 и 14 июня. 👉 Переходи на сайт, выбирай курсы и оставляй заявку — за 10 минут поможем собрать комплект под твою цель.

✔️ Java-тест: задачка с реального собеса Наш подписчик прислал реальную задачу с собеса в Яндекс. Сможете решить? 👇 📦 Задание Реализуйте банкомат и тесты к нему. Инициализируется набором купюр, умеет выдавать купюры под заданную сумму либо отвечать отказом. При выдаче купюры списываются с баланса.
/**
 * Банкомат.
 * Инициализируется набором купюр, выдаёт купюры под сумму либо отказывает.
 * При выдаче купюры списываются с баланса.
 *
 * Номиналы:
 *  - 50, 100, 500, 1000, 5000 ₽
 *  - 20, 100, 500 EUR
 *
 * Валюты обрабатываются раздельно, обмен не поддерживается.
 * Банкомат может использоваться многопоточно (резервирование выдачи).
 * Поддержку многопоточности можно вынести в отдельную итерацию.
 */
public class ATM {
    public ??? withdraw(???) {
        // TODO
    }
}
📋 Требования — Сами определите, что withdraw принимает и что возвращает. — Валюты считаются раздельно, обмена нет. — Сумму, которую нельзя собрать имеющимися купюрами, отклоняем (частичная выдача недопустима). — Покройте решение тестами. — Бонус: сделайте безопасным для вызова из нескольких потоков. Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

❓ Чем отличаются HashMap, Hashtable и ConcurrentHashMap HashMap — не потокобезопасен, разрешает один null-ключ и null-значения, самый быстрый в однопоточном коде. Hashtable — legacy-класс, синхронизирован целиком: один лок на всю таблицу, поэтому в многопоточке работает медленно. Не допускает null. ConcurrentHashMap — потокобезопасен с тонкой блокировкой: с Java 8 синхронизация идёт на уровне отдельного бакета через CAS и synchronized, что даёт высокую конкурентность. null не допускает (чтобы не путать «нет ключа» и «значение null» при гонках). 🐸 Библиотека собеса по Java #core

❓ ArrayList или LinkedList? В подавляющем большинстве случаев → ArrayList. ArrayList — это динамический массив: доступ по индексу O(1), вставка/удаление в середине O(n) из-за сдвига элементов. Но на практике он почти всегда быстрее за счёт локальности данных в памяти и дружбы с кешем процессора. LinkedList — двусвязный список: вставка/удаление по уже найденной позиции O(1), но доступ по индексу O(n), и каждый элемент — отдельный объект с накладными расходами на ссылки. LinkedList оправдан редко — например, когда нужен Deque с частыми вставками в оба конца. Для обычного списка берите ArrayList. 🐸 Библиотека собеса по Java #core

❓ Какой контракт связывает equals() и hashCode()? Контракт: если два объекта равны по equals(), их hashCode() обязан быть одинаков. Обратное не требуется — равные хеши не означают равенство объектов (коллизии допустимы). Если переопределить equals() и забыть про hashCode(), объект сломается в HashMap/HashSet: положили объект по одному хешу, ищем по другому, и не находим, хотя по equals() он равен. Дополнительно equals() должен быть рефлексивным, симметричным, транзитивным и согласованным (не меняться без изменения полей). 🐸 Библиотека собеса по Java #core

📊 Хотите войти в Data Science, но математика кажется самым сложным этапом? На практике большинство джунов спотыкаются не о P
📊 Хотите войти в Data Science, но математика кажется самым сложным этапом? На практике большинство джунов спотыкаются не о Python, а о математическую базу: ▪️ Теорию вероятностей и статистику ▪️ Линейную алгебру ▪️ Математический анализ ▪️ Комбинаторику Именно на этих темах строятся машинное обучение, аналитика данных и рекомендательные системы. Освойте ключевые разделы математики, которые используются в Data Science и Machine Learning на курсе «Математика для Data Science». Что вас ждет: 🔹 40+ видеолекций и 150+ практических заданий на Python 🔹 Проверка домашних работ и обратная связь от преподавателей 🔹 Подготовка к задачам с технических собеседований 🔹 Программа от преподавателей ВМК МГУ, НИУ ВШЭ и экспертов индустрии Курс подойдет разработчикам, аналитикам и всем, кто планирует развиваться в Data Science и Machine Learning. 👉 Записаться на бесплатный демо-урок

❓ Чем livelock и starvation отличаются от deadlock? Все три — проблемы прогресса, но механизм разный. ▪️ Deadlock — потоки заблокированы навсегда, ждут ресурсы друг друга и ничего не делают. ▪️ Livelock — потоки не заблокированы и активно работают, но из-за постоянной реакции друг на друга не продвигаются вперёд. Аналогия: два человека в коридоре бесконечно уступают дорогу в одну и ту же сторону. ▪️ Starvation (голодание) — поток в принципе мог бы работать, но ресурс постоянно перехватывают другие. Например, низкоприоритетный поток при жадных высокоприоритетных или несправедливый (unfair) лок. 🐸 Библиотека собеса по Java #concurrency

🔴 Завтра тестовое собеседование с Java-разработчиком 10 июня(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседо
🔴 Завтра тестовое собеседование с Java-разработчиком 10 июня(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Виктору Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

❓ Какие параметры у ThreadPoolExecutor и что произойдёт при переполнении? Ключевые параметры: corePoolSize, maximumPoolSize, keepAliveTime, рабочая очередь и политика отказа. Логика приёма задачи: если активных потоков меньше core — создаётся поток; иначе задача кладётся в очередь; если очередь заполнена и потоков меньше max — создаётся новый поток до максимума; если и это невозможно — срабатывает политика отказа (AbortPolicy бросает исключение, CallerRunsPolicy выполняет в вызывающем потоке, DiscardPolicy молча отбрасывает). Опасность фабрик Executors: newFixedThreadPool использует неограниченную очередь, newCachedThreadPool использует неограниченное число потоков. Оба под нагрузкой ведут к OutOfMemoryError. 🐸 Библиотека собеса по Java #concurrency

✔️ Spring-тест: идемпотентность платёжного эндпоинта Напишите защиту от двойного списания 👇 📦 Задание Клиент при сетевом таймауте повторяет POST /payments и списание проходит дважды. Реализуйте идемпотентность по заголовку Idempotency-Key.
@PostMapping("/payments")
public PaymentResult pay(
        @RequestHeader("Idempotency-Key") String key,
        @RequestBody PaymentRequest request) {
    // Ваша реализация
}
📋 Требования — Повторный запрос с тем же ключом возвращает результат первого вызова и НЕ выполняет списание заново. — Разные ключи → разные операции. — Конкурентные запросы с одним ключом (двойной клик / параллельные ретраи) не должны привести к двойному выполнению. — Ключ хранится с TTL (например, 24 часа). Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

❓ Объясните правило PECS (Producer Extends, Consumer Super)? Это правило выбора ограниченных wildcards в дженериках. ? extends T — ковариантность, структура-«производитель»: из неё можно безопасно читать как T, но нельзя добавлять элементы, потому что компилятор не знает точный подтип. ? super T — контравариантность, структура-«потребитель»: в неё можно безопасно добавлять T и его подтипы, но при чтении вернётся только Object. Отсюда мнемоника: если коллекция только отдаёт данные (producer) → extends; если только принимает (consumer) → super. 🐸 Библиотека собеса по Java #core

❓ Что такое type erasure и какие ограничения он накладывает на дженерики? generics дают типобезопасность на этапе компиляции, но в рантайме информация о типовых параметрах стирается: List<String> превращается в обычный List, а компилятор сам вставляет приведения типов. Сделано ради обратной совместимости со старым кодом. Из-за стирания нельзя: → создать new T() или new T[]; → использовать instanceof List<String>; → иметь статические поля типа T; → объявить два метода, отличающиеся только параметром типа (после стирания их сигнатуры совпадут). Частичная информация о дженериках сохраняется в сигнатурах полей и методов и доступна через рефлексию, но не на уровне конкретных экземпляров. 🐸 Библиотека собеса по Java #core

⚡️ Продолжаем знакомить вас с экспертами курса AgentOps! — Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов:
⚡️ Продолжаем знакомить вас с экспертами курса AgentOps! — Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов: оптимизировать затраты на разработку и продакшен, внедрить model routing, semantic cache и систему алертов для контроля расходов — Эмиль Сатаев разберет Context Engineering: управление контекстом, защиту от prompt injection, работу с длинными контекстами и построение безопасного пайплайна входа для AI-систем — Михаил Бондаревский покажет, как подготовить инфраструктуру для AI-агентов: Docker, sandboxing, streaming, docker-compose и воспроизводимое окружение для разработки и продакшена — Мурат Хажгериев расскажет про Enterprise Integrations & MCP: когда MCP действительно нужен, как подключать внешние сервисы и реализовывать интеграции с OAuth2 delegation — Герман Сабиров разберет Governance & Compliance для AI-систем: data flow, audit logs, требования 152-ФЗ, локализацию данных и построение compliance-подхода на уровне архитектуры Курс для backend-разработчиков, тимлидов и LLM инженеров о том, как внедрять AI-логику в бэкенд IT-продуктов и сохранять стабильность сервиса. 👉 Изучить обновленную программу AgentOps и занять место.

❓ Возможна ли утечка памяти, несмотря на сборщик мусора? Да, возможна. GC удаляет только недостижимые объекты. Утечка — это когда объекты остаются достижимыми, но больше не нужны, и память не освобождается. Типичные источники: → неограниченные кеши и статические коллекции (static Map), которые растут без удаления; → незакрытые ресурсы (соединения, стримы); → слушатели/колбэки без отписки; → ThreadLocal в пуле потоков, где значение не очищается через remove() (поток переиспользуется и не умирает); → утечка класслоадеров при горячей перезагрузке. 🐸 Библиотека собеса по Java #core

❓ Что такое escape analysis и какие оптимизации он даёт? Это анализ JIT-компилятора, который определяет, «убегает» ли объект за пределы метода или потока. Если объект создаётся и используется только локально и наружу не уходит, JVM может: → Scalar replacement — вообще не создавать объект в куче, а разложить его на отдельные поля в регистрах/на стеке. Это снимает нагрузку на GC. → Lock elision — убрать синхронизацию, если объект гарантированно не виден другим потокам. 🐸 Библиотека собеса по Java #jvm

❓ Что происходит с объектом, когда на него не осталось ссылок? Объект становится кандидатом на сборку мусора, но память освобождается не сразу. GC ориентируется на достижимость от GC roots (стек потоков, статические поля, JNI-ссылки, активные локальные переменные). Пока объект достижим хотя бы по одной цепочке — он живой. Как только он перестаёт быть достижимым, он помечается недостижимым и память освобождается при ближайшем цикле сборки. Если у объекта есть finalize() или он зарегистрирован в Cleaner/PhantomReference, освобождение откладывается на дополнительный цикл. 🐸 Библиотека собеса по Java #core

💬 Обратная связь Текущий уровень сложности вопросов? 🔥 — Слишком просто, хочу сложнее 👍🏼 — В самый раз ❤️ — Иногда сложновато 😁 — Часто не понимаю 🐸 Библиотека собеса по Java

❓ Расскажите о паттерне Interpreter Interpreter — это поведенческий паттерн, который определяет грамматику простого языка и интерпретатор для его предложений. Простыми словами: вы описываете правила «мини-языка» в виде классов, и каждый класс умеет вычислить свою часть выражения. Как калькулятор, который разбирает «3 + 5 * 2». ▪️ Пример: Движок фильтрации пользователей по правилам: «возраст > 18 AND город = Москва». Каждое условие — узел дерева выражений.
// Абстрактное выражение
interface Expression {
    boolean interpret(Map<String, String> context);
}

// Терминальное выражение — проверка одного поля
class Equals implements Expression {
    private final String key;
    private final String value;

    public Equals(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public boolean interpret(Map<String, String> context) {
        return value.equals(context.get(key));
    }
}

class GreaterThan implements Expression {
    private final String key;
    private final int threshold;

    public GreaterThan(String key, int threshold) {
        this.key = key;
        this.threshold = threshold;
    }

    public boolean interpret(Map<String, String> context) {
        return Integer.parseInt(context.getOrDefault(key, "0")) > threshold;
    }
}

// Нетерминальные выражения — комбинаторы
class And implements Expression {
    private final Expression left, right;

    public And(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    public boolean interpret(Map<String, String> context) {
        return left.interpret(context) && right.interpret(context);
    }
}

class Or implements Expression {
    private final Expression left, right;

    public Or(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    public boolean interpret(Map<String, String> context) {
        return left.interpret(context) || right.interpret(context);
    }
}

// Использование: возраст > 18 AND город = Москва
Expression rule = new And(
    new GreaterThan("age", 18),
    new Equals("city", "Москва")
);

Map<String, String> user1 = Map.of("age", "25", "city", "Москва");
Map<String, String> user2 = Map.of("age", "16", "city", "Москва");

System.out.println(rule.interpret(user1)); // true
System.out.println(rule.interpret(user2)); // false
▪️ Когда использовать — Есть простой язык или набор правил, которые нужно интерпретировать — Грамматика стабильна, но выражений — много — Пример: SpEL (Spring Expression Language), регулярные выражения ▪️ Минус Для сложных грамматик дерево классов разрастается и становится неуправляемым — лучше использовать парсер-генераторы (ANTLR). 🐸 Библиотека собеса по Java #patterns

❓ Расскажите о паттерне Visitor Visitor — это поведенческий паттерн, который позволяет добавлять новые операции к объектам, не изменяя их классы. Простыми словами: налоговый инспектор (visitor) приходит в разные компании и выполняет проверку — компании не меняются, а новые виды проверок добавляются легко. ▪️ Пример: Система документооборота: есть разные типы документов, и нужно добавлять операции (экспорт, валидация, подсчёт статистики) без изменения классов документов.
// Visitor
interface DocumentVisitor {
    void visit(Invoice invoice);
    void visit(Contract contract);
    void visit(Report report);
}

// Элементы
interface Document {
    void accept(DocumentVisitor visitor);
}

class Invoice implements Document {
    private final BigDecimal amount;
    public Invoice(BigDecimal amount) { this.amount = amount; }
    public BigDecimal getAmount() { return amount; }

    public void accept(DocumentVisitor visitor) {
        visitor.visit(this); // double dispatch
    }
}

class Contract implements Document {
    private final LocalDate expiryDate;
    public Contract(LocalDate expiryDate) { this.expiryDate = expiryDate; }
    public LocalDate getExpiryDate() { return expiryDate; }

    public void accept(DocumentVisitor visitor) {
        visitor.visit(this);
    }
}

class Report implements Document {
    private final int pageCount;
    public Report(int pageCount) { this.pageCount = pageCount; }
    public int getPageCount() { return pageCount; }

    public void accept(DocumentVisitor visitor) {
        visitor.visit(this);
    }
}

// Конкретный visitor — новая операция без изменения документов
class ExportVisitor implements DocumentVisitor {
    public void visit(Invoice invoice) {
        System.out.println("Экспорт счёта: " + invoice.getAmount() + " ₽");
    }
    public void visit(Contract contract) {
        System.out.println("Экспорт договора до " + contract.getExpiryDate());
    }
    public void visit(Report report) {
        System.out.println("Экспорт отчёта: " + report.getPageCount() + " стр.");
    }
}

// Использование
List<Document> docs = List.of(
    new Invoice(new BigDecimal("150000")),
    new Contract(LocalDate.of(2027, 1, 1)),
    new Report(42)
);

DocumentVisitor exporter = new ExportVisitor();
docs.forEach(doc -> doc.accept(exporter));
▪️ Когда использовать — Нужно выполнить операцию над группой разнородных объектов — Новые операции добавляются часто, а новые типы элементов — редко — Пример из JDK: java.nio.file.FileVisitor ▪️ Минус Visitor нужно обновлять при добавлении нового типа элемента — нарушается Open/Closed Principle для элементов. 🐸 Библиотека собеса по Java #patterns