Библиотека собеса по Java | вопросы с собеседований
6.36K subscribers
441 photos
12 videos
760 links
Вопросы с собеседований по Java и ответы на них.

По рекламе: @tproger_sales_bot

Учиться у нас: clc.to/3wECtA

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Чем thenApply отличается от thenCompose?

Ответ: thenApply преобразует полученное значение. Если функция вернула ещё один CompletableFuture, результатом будет вложенная конструкция — future внутри future. thenCompose нужен, когда следующий шаг сам возвращает CompletionStage. Он связывает этапы и возвращает одну общую стадию с конечным результатом. Выбирайте thenApply для обычного преобразования, а thenCompose — для последовательности зависимых асинхронных операций.

Документация: CompletableFuture

Основа вопроса: Подборка по публичным Java-собеседованиям, тема CompletableFuture.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Блокируют ли друг друга static synchronized и synchronized-метод экземпляра?

Ответ: Сами по себе — нет. Статический метод захватывает монитор объекта Class, а метод экземпляра — монитор this. Это разные блокировки, поэтому два метода могут выполняться одновременно. Если они работают с одними данными, наличие слова synchronized в обоих ещё не обеспечивает защиту. Для согласованного доступа все участники должны использовать одну и ту же блокировку.

Документация: мониторы и синхронизация

Основа вопроса: Подборка по публичным Java-собеседованиям, тема static synchronized.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Может ли return в finally скрыть исключение из try?

Ответ: Да. Если try выбросил исключение, а finally завершился через return, метод вернёт значение из finally. Исходное исключение не продолжит распространяться. Аналогично новый throw в finally может заменить прежнюю ошибку. Поэтому в finally лучше оставлять очистку ресурсов и избегать команд, которые меняют способ завершения метода. Для закрываемых ресурсов обычно удобнее try-with-resources.

Документация: выполнение try-finally

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Почему в List<? extends Number> нельзя добавить Integer?

Ответ: Точный тип элементов неизвестен. За такой ссылкой может находиться, например, List<Double>. Если разрешить добавить Integer, типобезопасность нарушится. Читать элементы можно как Number, потому что верхняя граница известна. Для коллекции, в которую нужно добавлять целые числа, часто подходит List<? super Integer>. Отдельный случай — null: система типов его допускает, но сама реализация списка может запрещать вставку.

Документация: wildcard с верхней границей

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👀 Освобождает ли Thread.sleep монитор и чем он отличается от Object.wait?

Ответ: Thread.sleep приостанавливает текущий поток и сохраняет захваченные им мониторы. Другие потоки продолжат ждать, если им нужен тот же монитор.

Object.wait освобождает монитор объекта, на котором вызван, и переводит поток в ожидание. Перед вызовом поток должен владеть этим монитором. Перед продолжением работы он снова захватывает его.

wait используют в цикле проверки условия: после пробуждения условие могло измениться, возможны и ложные пробуждения. Другие мониторы, которыми владеет поток, wait не освобождает.

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
👀 Почему ThreadLocal нужно очищать после задачи в пуле потоков?

Ответ: ThreadLocal связывает значение с потоком. Рабочий поток пула может пережить множество задач, поэтому данные одного запроса способны остаться до следующего запуска на том же потоке.

Если там хранится пользователь, идентификатор запроса или другой контекст, новая задача может получить старое значение. Пока значение удерживается потоком, связанный с ним объект также может оставаться в памяти.

Контекст задачи очищают через remove() в finally. Если внутри временно подменяется уже существующий контекст, после работы восстанавливают прежнее значение.

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👀 Чем Thread.interrupted() отличается от isInterrupted()?

Ответ: Thread.interrupted() — статический метод. Он проверяет флаг прерывания текущего потока и сбрасывает его. При двух вызовах подряд второй обычно вернёт false, если за это время не поступило новое прерывание.

thread.isInterrupted() проверяет флаг указанного потока и сохраняет его состояние.

Эта разница важна в циклах обработки отмены: проверка через interrupted() расходует сигнал. Если InterruptedException перехвачен, а передать его выше нельзя, часто нужно восстановить флаг через Thread.currentThread().interrupt().

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Куда попадёт исключение из задачи, переданной через execute и submit?

Ответ: В обычном ThreadPoolExecutor неперехваченное исключение из Runnable, переданного через execute, выходит из задачи. Рабочий поток завершается, а ошибка попадает в механизм обработки неперехваченных исключений, включая UncaughtExceptionHandler.

submit оборачивает задачу в Future. Исключение сохраняется в ней, а вызов get() выбрасывает ExecutionException с исходной ошибкой в cause.

Если результат submit никто не проверяет, ошибка может остаться незамеченной. Для фоновых задач заранее определите, кто получает результат и где регистрируются сбои.

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👀 Чем CountDownLatch отличается от CyclicBarrier и что можно использовать повторно?

Ответ: CountDownLatch ждёт, пока счётчик событий дойдёт до нуля. Рабочие задачи вызывают countDown(), а ожидающий поток — await(). После достижения нуля этот latch остаётся открытым: сбросить счётчик нельзя.

CyclicBarrier собирает заданное количество участников в одной точке. Каждый вызывает await(), а когда приходят все, они продолжают работу. Затем барьер можно использовать для следующего этапа.

Latch удобен для ожидания завершения набора работ. Barrier — для алгоритма, в котором несколько потоков многократно встречаются между этапами.

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
👀 Почему при переопределении equals нужно переопределять hashCode?

Ответ: Контракт Java требует: если два объекта равны по equals, их hashCode должен совпадать.

HashMap и HashSet используют хеш, чтобы выбрать область поиска, а затем проверяют равенство объектов. Если equals переопределён, а hashCode остался несовместимым, коллекция может не найти равный ключ или сохранить несколько равных элементов.

Обычно оба метода строят на одном наборе значимых полей. Совпадение хешей у неравных объектов допустимо: это коллизия. Результат hashCode должен сохраняться, пока поля, участвующие в equals, не меняются.

Документация

Вопрос из подборки для собеседований

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Какое исключение сохранит try-with-resources, если ошиблись и try, и close?

Ответ: Если исключение возникло в теле try и затем при закрытии ресурса, основным останется исключение из try. Ошибка из close попадёт в список подавленных исключений — её можно получить через getSuppressed().

Ресурсы закрываются в обратном порядке объявления. Если тело try завершилось нормально, а close выбросил исключение, оно само станет основным. Это помогает сохранить причину сбоя и ошибки освобождения ресурсов.

Документация.

Источник вопроса

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2