Библиотека собеса по Java | вопросы с собеседований
СтатистикаВопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot
- Последний пост
- 5 авг.
- Последнее чтение
- 11:47
- Постов за неделю
- 0
- Всего постов
- 131
- Тип
- открытый
- Язык
- русский
- Категория
- Технологии (по похожим)
- В каталоге с
- 12 авг.
- 1/24сутки в ленте
- 695
- 1/48двое суток
- 796
- 1/72трое суток
- 859
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
❓ Что такое "diamond problem" и как его решает Java? «Diamond problem» возникает при множественном наследовании, когда класс может унаследовать одну и ту же реализацию от разных родителей. В Java классы не поддерживают множественное наследование, а только интерфейсы позволяют такое. Если два интерфейса имеют одинаковый default-метод, то компилятор потребует явного переопределения в классе. Это и есть решение проблемы. 🐸 Библиотека собеса по Java #tests
👅 Самое сложное — выбрать не курс, а направление Сегодня хочется разобраться в 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
🎯 У разработчика, 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
У вас в проекте есть файл вроде 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
📈 Скоро фраза «умею пользоваться 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