Чем thenApply отличается от thenCompose?
Ответ: thenApply преобразует полученное значение. Если функция вернула ещё один CompletableFuture, результатом будет вложенная конструкция — future внутри future. thenCompose нужен, когда следующий шаг сам возвращает CompletionStage. Он связывает этапы и возвращает одну общую стадию с конечным результатом. Выбирайте thenApply для обычного преобразования, а thenCompose — для последовательности зависимых асинхронных операций.
Документация: CompletableFuture
Основа вопроса: Подборка по публичным Java-собеседованиям, тема CompletableFuture.
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Основа вопроса: Подборка по публичным Java-собеседованиям, тема CompletableFuture.
Please open Telegram to view this post
VIEW IN TELEGRAM
Блокируют ли друг друга static synchronized и synchronized-метод экземпляра?
Ответ: Сами по себе — нет. Статический метод захватывает монитор объекта Class, а метод экземпляра — монитор this. Это разные блокировки, поэтому два метода могут выполняться одновременно. Если они работают с одними данными, наличие слова synchronized в обоих ещё не обеспечивает защиту. Для согласованного доступа все участники должны использовать одну и ту же блокировку.
Документация: мониторы и синхронизация
Основа вопроса: Подборка по публичным Java-собеседованиям, тема static 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
Object.wait освобождает монитор объекта, на котором вызван, и переводит поток в ожидание. Перед вызовом поток должен владеть этим монитором. Перед продолжением работы он снова захватывает его.
wait используют в цикле проверки условия: после пробуждения условие могло измениться, возможны и ложные пробуждения. Другие мониторы, которыми владеет поток, wait не освобождает.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Если там хранится пользователь, идентификатор запроса или другой контекст, новая задача может получить старое значение. Пока значение удерживается потоком, связанный с ним объект также может оставаться в памяти.
Контекст задачи очищают через remove() в finally. Если внутри временно подменяется уже существующий контекст, после работы восстанавливают прежнее значение.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
thread.isInterrupted() проверяет флаг указанного потока и сохраняет его состояние.
Эта разница важна в циклах обработки отмены: проверка через interrupted() расходует сигнал. Если InterruptedException перехвачен, а передать его выше нельзя, часто нужно восстановить флаг через Thread.currentThread().interrupt().
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
submit оборачивает задачу в Future. Исключение сохраняется в ней, а вызов get() выбрасывает ExecutionException с исходной ошибкой в cause.
Если результат submit никто не проверяет, ошибка может остаться незамеченной. Для фоновых задач заранее определите, кто получает результат и где регистрируются сбои.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
CyclicBarrier собирает заданное количество участников в одной точке. Каждый вызывает await(), а когда приходят все, они продолжают работу. Затем барьер можно использовать для следующего этапа.
Latch удобен для ожидания завершения набора работ. Barrier — для алгоритма, в котором несколько потоков многократно встречаются между этапами.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
HashMap и HashSet используют хеш, чтобы выбрать область поиска, а затем проверяют равенство объектов. Если equals переопределён, а hashCode остался несовместимым, коллекция может не найти равный ключ или сохранить несколько равных элементов.
Обычно оба метода строят на одном наборе значимых полей. Совпадение хешей у неравных объектов допустимо: это коллизия. Результат hashCode должен сохраняться, пока поля, участвующие в equals, не меняются.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
Ресурсы закрываются в обратном порядке объявления. Если тело try завершилось нормально, а close выбросил исключение, оно само станет основным. Это помогает сохранить причину сбоя и ошибки освобождения ресурсов.
Источник вопроса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2