fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

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

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

رفتن به کانال در Telegram

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

نمایش بیشتر
6 381
مشترکین
-624 ساعت
-197 روز
-5130 روز
آرشیو پست ها
❓ Что такое @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

У вас в проекте есть файл вроде utils_v2_final_FIX.py, который все боятся трогать ❓ Что делаете с таким легаси? ❤️ Не трогаю:
У вас в проекте есть файл вроде 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 #practise

📈 Скоро фраза «умею пользоваться AI» в резюме будет звучать так же странно, как сегодня «умею пользоваться Git» Это просто с
📈 Скоро фраза «умею пользоваться AI» в резюме будет звучать так же странно, как сегодня «умею пользоваться Git» Это просто станет частью профессии. А вот умение встроить AI в процесс разработки так, чтобы он действительно ускорял работу команды, останется конкурентным преимуществом 💡 🔜 На курсе «ИИ для разработчиков» участники работают со своими проектами и учатся делать AI частью ежедневной разработки: планировать задачи, писать код, проверять изменения, готовить PR и автоматизировать рутину. До конца июля действует специальная цена — 59 990 ₽ вместо 79 990 ₽ 🥳 И получить бессрочный доступ ко всем материалам курса. 🔗 Посмотреть, как устроен курс 🏃‍♀️ Proglib Academy

🥳 До конца июля сохраняются две приятные вещи: специальная цена и бессрочный доступ к материалам курса. Подробнее — в посте 👇

❓ Что такое Phantom Reference и зачем она нужна? PhantomReference — самая слабая ссылка в Java. Отличается от WeakReference тем, что get() всегда возвращает null. Используется для отслеживания момента, когда объект удалён из памяти. После удаления объекта PhantomReference помещается в ReferenceQueue. В отличие от finalize(), это надёжный способ отследить удаление объекта. Используется редко, в основном во внутренних механизмах или для управления off-heap памятью. 🐸 Библиотека собеса по Java #jvm

❓ Какие есть методы в классе Object? Класс Object — это базовый класс для всех классов в Java. Он содержит следующие методы: 🔹 public final Class<?> getClass() – возвращает объект Class для текущего объекта. 🔹 public int hashCode() – возвращает хэш-код объекта. 🔹 public boolean equals(Object obj) – сравнивает объекты на равенство. 🔹 protected Object clone() – создает копию объекта (глубокое/поверхностное копирование зависит от реализации). 🔹 public String toString() – строковое представление объекта. 🔹 public final void notify() – пробуждает один поток, ожидающий монитор объекта. 🔹 public final void notifyAll() – пробуждает все потоки, ожидающие монитор объекта. 🔹 public final void wait() – заставляет поток ждать, пока его не разбудят через notify/notifyAll. 🔹 public final void wait(long timeout) – ждет указанное время или до уведомления. 🔹 public final void wait(long timeout, int nanos) – более точная версия ожидания. 🔹 protected void finalize() – вызывается перед удалением объекта сборщиком мусора (deprecated с Java 9). 🐸 Библиотека собеса по Java #core

❓ Расскажите о volatile? volatile — это модификатор переменной, который гарантирует: ▪️ Видимость изменений между потоками ▪️ Запрет кэширования в регистре потока Использовать стоит, когда: ▪️ Есть несколько потоков, которые читают/пишут одну переменную. ▪️ Нет сложных операций над этой переменной (например, инкрементов, которые требуют атомарности). volatile не обеспечивает атомарности, поэтому для операций «чтение-модификация-запись» нужны синхронизация или атомарные типы (AtomicInteger, AtomicReference и т.п.). 🐸 Библиотека собеса по Java #concurrency

😸 Каждый разработчик подходит к задаче со своим опытом: помнит прошлые решения, знает ограничения проекта и понимает, какой
😸 Каждый разработчик подходит к задаче со своим опытом: помнит прошлые решения, знает ограничения проекта и понимает, какой код команда пропустит на ревью. Для человека это естественная часть работы. У Claude Code этого контекста по умолчанию нет — только задача и инструкции, которые ему дали.
Поэтому в большой команде недостаточно просто выбрать хорошую модель. ❗️ Нужно ещё объяснить ей, как у вас устроена разработка: какие подходы приняты, что обязательно проверять и по каким правилам принимать решения.
🗓 23 июля в 19:00 МСК поговорим об этом на бесплатном вебинаре с Алексеем Жиряковым — он Executive Director в Сбере, руководит GenAI Data Platform, и с этой проблемой сталкивался не раз 🔥 Покажет живое демо, разберём, как встроить AI в процесс разработки так, чтобы он реально помогал, а не добавлял ещё один повод для споров на ревью. 🔗 Занять место на вебинаре 🏃‍♀️ Proglib Academy

❓ Разница между Lambdas и Anonymous Classes? И лямбды, и анонимные классы позволяют создавать "одноразовые" реализации, но лямбды — это более короткий и функциональный способ записать код, реализующий функциональный интерфейс (т.е. интерфейс с одним абстрактным методом). Ключевые отличия: → Синтаксис: лямбда короче и читабельнее. → Производительность: лямбды компилируются как invoke-dynamic и не создают новый класс → меньше накладных расходов. → this: внутри лямбды this указывает на внешний объект, а в анонимном классе — на экземпляр самого анонимного класса. → Назначение: анонимные классы подходят, если нужно переопределить несколько методов или иметь состояние. Лямбды — только для одного метода. 🐸 Библиотека собеса по Java #core

❓ StackOverflowError vs OutOfMemoryError? 🔹 StackOverflowError Возникает когда переполняется стек вызовов конкретного потока. Обычно из-за бесконечной или слишком глубокой рекурсии. 🔹 OutOfMemoryError Возникает когда JVM не может выделить память в куче (heap) для новых объектов. Это проблема всего приложения, а не отдельного потока. 🐸 Библиотека собеса по Java #jvm

❓ Какие бывают гарантии доставки сообщений в 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

✔️ Java-тест: сортировка падает только на больших данных Локально всё ок, на проде — IllegalArgumentException: Comparison method violates its general contract! 👇 📦 Задание — code review Сортируем товары: сначала в наличии, потом по убыванию рейтинга.
products.sort((a, b) -> {
    if (a.isInStock() && !b.isInStock()) return -1;
    if (!a.isInStock() && b.isInStock()) return 1;
    return (int) (b.getRating() - a.getRating()); // rating: double
});
▪️ Объясни — Почему этот компаратор нарушает контракт (нетранзитивность / нарушение антисимметрии) и почему падает только на достаточно больших списках. — Как переписать, чтобы было корректно и читаемо. Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

🧑‍💻 Учиться агентной разработке — у тех, кто уже внедряет её в бигтехе Курс «ИИ для разработчиков» ведут практики из ведущи
🧑‍💻 Учиться агентной разработке — у тех, кто уже внедряет её в бигтехе Курс «ИИ для разработчиков» ведут практики из ведущих российских IT-компаний 🔥 🔵 Они прошли путь от первых экспериментов с AI до рабочих процессов, в которых агенты помогают команде писать код, готовить PR и быстрее доводить задачи до продакшена. В ближайшее время познакомим вас с каждым преподавателем. Программа курса — по ссылке 🎹 🏃‍♀️ Proglib Academy