Библиотека собеса по Java | вопросы с собеседований
رفتن به کانال در Telegram
Вопросы с собеседований по Java и ответы на них. По рекламе: @tproger_sales_bot Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot
نمایش بیشتر6 373
مشترکین
-324 ساعت
-267 روز
-5430 روز
آرشیو پست ها
❓ Расскажите о паттерне Proxy?
Proxy (Заместитель) — это структурный паттерн, который подставляет объект-заместитель вместо реального объекта для управления доступом к нему.
🔹 Когда использовать
— Нужно контролировать доступ к объекту (например, кеширование, логирование, контроль прав).
— Создание объекта дорогое, и его инициализацию стоит отложить (Lazy Initialization).
— Требуется добавление дополнительной логики перед/после вызова методов объекта.
🔹 Типы Proxy
1. Virtual Proxy — ленивое создание объекта (например, подгрузка больших данных).
2. Protection Proxy — контроль доступа (например, права пользователей).
3. Remote Proxy — доступ к удалённому объекту (RMI, REST).
4. Logging Proxy — логирование вызовов.
⚠️ Proxy не меняет интерфейс объекта, а просто управляет доступом к нему.
🐸 Библиотека собеса по Java
❓ В чем разница между проверяемыми и непроверяемыми исключениями?
Проверяемые исключения (Checked Exceptions) — это исключения, которые компилятор требует обработать (try-catch или throws). Они наследуются от Exception, но не от RuntimeException. Примеры: IOException, SQLException. Нужны для предупреждения ошибок, которые предсказуемы, но неизбежны.
Непроверяемые исключения (Unchecked Exceptions) — это исключения, которые не требуют явной обработки, компилятор их не проверяет. Они наследуются от RuntimeException и могут возникать в любом месте программы. Примеры: NullPointerException, ArrayIndexOutOfBoundsException. Возникают из-за ошибок разработчика, как правило, а не связаны с внешними условиями.
🐸 Библиотека собеса по Java
❓ Чем отличается абстрактный класс от интерфейса?
Абстрактный класс может содержать как абстрактные, так и конкретные методы, а интерфейс до Java 8 мог содержать только абстрактные методы (с Java 8 появились default и static методы).
🔹 Наследование: класс может наследоваться только от одного абстрактного класса, но реализовать несколько интерфейсов.
🔹 Модификаторы: методы интерфейса по умолчанию public, а в абстрактном классе можно использовать разные модификаторы доступа.
🔹 Поля: интерфейс содержит только public static final (константы), а абстрактный класс может иметь обычные поля.
🔹 Когда использовать
Абстрактный класс — если есть частичная реализация или состояние.
Интерфейс — если нужна контрактная функциональность без реализации.
🐸 Библиотека собеса по Java
❓ Что такое стек-трейс?
Стек-трейс (stack trace) — это последовательность вызовов методов в стеке выполнения программы на момент возникновения ошибки. Он показывает путь, по которому код дошел до исключения, и помогает отлаживать программы.
🔹 Что даёт стек-трейс
— Помогает быстро найти причину ошибки
— Показывает путь выполнения программы
— Позволяет глубже понимать код и его логику
🐸 Библиотека собеса по Java
❓ Как работает CopyOnWriteArrayList?
CopyOnWriteArrayList — это потокобезопасная реализация List, в которой изменения происходят на копии массива.
🔹 Чтение (get, contains) выполняется без блокировок, т.к. работает с неизменяемым массивом.
🔹 Запись (add, set, remove) создает новую копию массива, где применяются изменения, а затем заменяет старый массив.
✔️ Плюсы
— Отлично подходит для сценариев, где чтение преобладает над записью.
— Не требует внешней синхронизации.
❌ Минусы
— При больших объемах данных запись дорогая по памяти и производительности.
— Итераторы работают с старой версией массива, поэтому изменения после их создания не видны (fail-safe).
🐸 Библиотека собеса по Java
❓ Какие существуют состояния потока?
Thread может находиться в одном из следующих состояний (Thread.State):
1️⃣ NEW — поток создан, но еще не запущен.
2️⃣ RUNNABLE — поток готов к выполнению, но может ожидать процессорное время.
3️⃣ BLOCKED — поток ждет освобождения монитора для входа в synchronized блок.
4️⃣ WAITING — поток ожидает сигнал без тайм-аута.
5️⃣ TIMED_WAITING — поток ожидает, но с ограничением по времени.
6️⃣ TERMINATED — поток завершил выполнение.
🐸 Библиотека собеса по Java
❓ Что такое сигнатура метода в Java?
Сигнатура метода — это его уникальная идентификация в рамках класса, включающая имя метода и список параметров (их порядок и типы).
Возвращаемый тип и модификаторы доступа не входят в сигнатуру. Именно благодаря сигнатуре JVM определяет, какие методы можно перегружать (overloading).
⚠️ Два метода с одинаковой сигнатурой в одном классе не могут существовать.
🐸 Библиотека собеса по Java
❓ Что собой представляет Сага?
Сага — это паттерн управления распределенными транзакциями, применяемый в микросервисной архитектуре. Он позволяет разбить большую транзакцию на последовательность локальных шагов, каждый из которых выполняется независимо и имеет свой компенсирующий шаг на случай ошибки.
🔹 Реализации
1. Оркестровая — централизованный координатор управляет шагами
2. Хореографическая — шаги взаимодействуют напрямую, реагируя на события друг друга
🔹 Использование
1. Разработка микросервисов
2. Разработка распределенных систем
3. Разработка приложения с бизнес-процессами с долгоживущими транзакциями
🐸 Библиотека собеса по Java
❓ Как избежать Memory Leak?
Основные причины утечек памяти — это длительно живущие ссылки, которые мешают сборщику мусора освободить ненужные объекты. Чаще всего это происходит из-за неправильного использования статических коллекций, кешей или слушателей, которые не удаляются после использования.
Также стоит следить за ресурсами вроде файлов, соединений с БД и потоков, гарантируя их закрытие через try-with-resources. Отладить проблему помогают профилировщики памяти, такие как VisualVM или Eclipse MAT, анализирующие heap dump и выявляющие утечки.
💬 С какой незаметной утечкой вы сталкивались?
🐸 Библиотека собеса по Java
🎉 Поздравляем с 8 марта
Сегодня отмечаем вклад девушек-разработчиков, аналитиков, тестировщиков, тимлидов и всех, кто влюблён в код. Без вас IT не было бы таким, каким мы его знаем. С праздником, коллеги 💐
Женщины оставили огромный след в истории IT. Если вам кажется, что программирование — это исключительно «мужская территория», взгляните, вот лишь несколько легендарных женщин:
🔹 Ада Лавлейс — автор первой компьютерной программы ещё в 19 веке.
🔹 Грейс Хоппер — создала первый компилятор и популяризировала термин «баг».
🔹 Барбара Лисков — её принцип Liskov Substitution является основой ООП, в том числе в Java.
🔹 Эдит Кларк — первая женщина-инженер, внесшая вклад в вычислительные методы в энергетике.
🔹 Маргарет Гамильтон — разработала софт для посадки «Аполлона-11» на Луну.
А это только малая часть. В статье собраны ещё больше вдохновляющих историй.
🔗 Подробнее в статье
🐸 Библиотека джависта
⚙️ Как работает API
Proglib рассказывает базу в формате рилса
🤝 💼 IT-конференции: как сходить на мероприятие и извлечь из него максимум пользы
🚀 IT-конференции — это не только про кофе-брейки и бесплатные стикеры. Это шанс завести полезные знакомства, узнать инсайдерскую информацию и найти новые карьерные возможности. Но для этого нужно не просто прийти, а правильно подготовиться и ловить важные моменты.
Как извлечь из мероприятия максимум пользы? Как сделать так, чтобы оно дало не только эмоции, но и реальные бонусы для вашей карьеры?
🔗 Подробнее в статье
🐸 Библиотека джависта
❓ В чём разница между Comparator и Comparable?
▪️ Comparable используется для естественного порядка объектов. Класс, реализующий Comparable, должен переопределять метод compareTo(T o), который определяет порядок сортировки.
▪️ Comparator применяется, когда требуется несколько способов сортировки или невозможно изменить код сравниваемого класса. Он реализует метод compare(T o1, T o2).
📌 Главные отличия
— Comparable встраивается в сам класс, Comparator – это отдельный класс.
— Comparable задаёт естественный порядок, Comparator позволяет кастомизировать сортировку.
❓ Что такое Serial Garbage Collector?
Serial GC — это однопоточный сборщик мусора, работающий по принципу "Stop-the-World". Он останавливает выполнение всех потоков во время сборки мусора и использует копирующий алгоритм для молодых поколений (Young Gen) и компактирующий алгоритм для старших (Old Gen).
🔹 Как работает
1️⃣ В молодом поколении (Minor GC) используется копирующая стратегия: выжившие объекты перемещаются из Eden в Survivor, а из Survivor в Old Gen.
2️⃣ В старом поколении (Major GC / Full GC) выполняется уплотнение памяти для уменьшения фрагментации.
3️⃣ Так как GC работает в одном потоке, во время сборки остановка приложения неизбежна.
🔹 Когда использовать
— В одноядерных системах или при ограниченных ресурсах, где многопоточный GC создаст больше нагрузки.
— В маленьких JVM (до 1-2 ГБ памяти), где G1 или Parallel GC будут избыточны.
— В приложениях без жестких требований к паузам, например, в небольших утилитах или CLI-инструментах.
❓ Какие проблемы могут возникнуть при использовании synchronized, и как их решать?
1️⃣ Блокировки (Blocking)
— Потоки, ожидающие освобождения блокировки, простаивают, что снижает производительность.
— Решение: использовать ReentrantLock, который позволяет гибко управлять блокировками, включая таймауты и прерывания.
2️⃣ Взаимная блокировка (Deadlock)
— Возникает, когда два потока блокируют друг друга, ожидая освобождения ресурсов.
— Решение: явный порядок блокировки, использование tryLock() с таймаутом
3️⃣ Отсутствие гибкости
— Synchronized не дает возможности проверки состояния блокировки.
— Решение: Использовать Lock, который позволяет проверить, занята ли блокировка (isLocked()) и настроить приоритет выполнения.
4️⃣ Проблема ложного пробуждения (Spurious Wakeup)
— Поток может быть пробужден без явного вызова notify().
— Решение: всегда использовать while, а не if при ожидании wait().
+1
👀 Задача: Разработка высоконагруженного сервиса кеширования (middle+)
В компании возникла необходимость повысить производительность системы за счёт внедрения распределённого кеша. Ваша задача — спроектировать и реализовать высоконагруженный сервис кеширования, обеспечивающий быструю и надёжную работу в условиях интенсивного использования.
▪️ Условия:
1. Высокая доступность: сервис должен быть устойчив к сбоям и обеспечивать непрерывную работу.
2. Масштабируемость: возможность горизонтального масштабирования для обработки увеличивающегося объёма данных.
3. Консистентность данных: обеспечение согласованности данных между узлами кеша.
4. Управление устареванием: реализация механизма автоматического удаления устаревших данных из кеша.
💡 Ключевые моменты:
— Выбор технологии: определение подходящего решения для распределённого кеширования (например, Redis, Memcached или собственная реализация).
— Репликация и шардирование: обеспечение надёжности и производительности через распределение данных и их дублирование.
— Алгоритмы замещения: выбор и реализация стратегий удаления устаревших или редко используемых данных (например, LRU, LFU).
✔️ Решение:
Использовать Redis в режиме кластеризации для обеспечения распределённого хранения данных. Настроить репликацию для повышения отказоустойчивости и реализовать механизм шардирования для равномерного распределения нагрузки. Применить алгоритм LRU (Least Recently Used) для автоматического удаления устаревших данных. Внедрить системы мониторинга (например, Prometheus) и логирования для оперативного отслеживания состояния кеша и быстрого реагирования на возможные проблемы.
Реализация на картинке 👆🏻
💬 Обратная связь
Какое ощущение вызывают задачи последний месяц?
😁 — Вопросы скучные и слишком простые
👍🏼 — Вопросы нормальные
🔥 — Много нового и интересного
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
❓ Чем отличается ArrayList от LinkedList?
ArrayList — это динамический массив, а LinkedList — двусвязный список.
🔹 Структура данных
— ArrayList хранит элементы в массиве, доступ к элементу по индексу O(1).
— LinkedList хранит узлы, каждый из которых содержит ссылку на следующий и предыдущий, доступ O(n).
🔹 Операции вставки и удаления
— В ArrayList вставка/удаление в середине требует сдвига элементов (O(n)).
— В LinkedList вставка/удаление занимает O(1), если есть ссылка на нужный узел.
🔹 Использование памяти
— ArrayList хранит только данные.
— LinkedList требует памяти на ссылки между элементами.
💬 Вы хоть раз использовали LinkedList? Что это был за кейс?
