Почему TreeSet может не добавить объект, который не равен существующему по equals?
Ответ: Для TreeSet совпадение определяется результатом compareTo или переданного Comparator. Если сравнение возвращает ноль, коллекция считает элементы одинаковыми. Например, компаратор только по возрасту не позволит сохранить двух разных людей одного возраста. Чтобы коллекция соблюдала обычный контракт Set, порядок сравнения должен быть согласован с equals. Если это не так, поведение остаётся определённым, но может удивить вызывающий код.
Документация: TreeSet
Основа вопроса: Подборка по публичным Java-собеседованиям, темы TreeSet и сравнения объектов.
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Основа вопроса: Подборка по публичным Java-собеседованиям, темы TreeSet и сравнения объектов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем 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