Java Interview Tasks
4.83K subscribers
212 photos
1 video
1 file
140 links
Реальные вопросы и задачи с собеседований.
Оригинальный авторский контент.
Актуальный материал.
Уровень вопросов от junior до supersenior.

Автор канала - @alexzelentsov

По рекламе: @alexzelentsov
Download Telegram
🔍 Ответ на задачу про Optional: Почему orElse может тормозить ваш код? 🐢

Использование Optional — это стандарт де-факто в современном Java-коде. Но знаете ли вы разницу между orElse() и orElseGet()? Ошибка здесь может привести к лишним вызовам методов и даже к падению производительности.

Задача: Что произойдет, если вызвать orElse() для метода, который делает тяжелую операцию (например, запрос в БД), даже если значение в Optional уже есть?
Объяснение: orElse(T other) принимает готовый объект. Это значит, что аргумент вычисляется до вызова метода orElse. Даже если Optional не пустой, getDefaultValue() будет выполнен! orElseGet(Supplier<? extends T> other) принимает лямбду (Supplier). Она выполняется только тогда, когда Optional действительно пуст (ленивые вычисления).

Вывод: В примере выше на консоль выведется "Вызов тяжелого метода!", хотя значение "Hello" уже есть. Если бы мы использовали optional.orElseGet(() -> getDefaultValue()), лишнего вызова бы не было.

⚡️ Не перепутайте:
Используйте orElse(), если у вас уже есть готовая константа или примитив.
Используйте orElseGet(), если получение дефолтного значения требует вычислений или создания нового объекта.

Понравился разбор? Ставь ❤️, подписывайся и пиши в комментариях, какие ещё методы Optional тебя путают!

 #java #optional #performance #clean_code #backend #интервью #java_interview_tasks
❤16👍8🔥7👏1
🔍 Ответ на задачу про Enum.values(): Скрытые аллокации 📦
Спецификация Java требует, чтобы массив, возвращаемый values(), был изменяемым (вы можете заменить в нем элементы, хотя это и плохая практика). Чтобы пользователи не могли испортить внутреннее состояние перечисления, компилятор генерирует код, который создает копию массива при каждом вызове values().

Вывод:
Каждый вызов values() — это новая аллокация памяти. В высокопроизводительном коде лучше кешировать этот массив: private static final Color[] VALUES = Color.values().

⚡️ Не перепутайте:
Если вам нужно просто получить количество элементов, используйте кешированное значение или Java 21 Enum.entries.

#java #enum #performance #jvm #memory #интервью #java_interview_tasks
👍7🔥1
🔍 Ответ на задачу про Stream.findFirst vs findAny: В чём разница? 🔍
- findFirst() жестко привязан к порядку следования (encounter order). В параллельном стриме он потратит время на то, чтобы убедиться, что вернул именно первый элемент.
- findAny() позволяет среде выполнения выбрать любой подходящий элемент. В параллельных стримах это работает гораздо быстрее, так как не нужно координировать потоки для соблюдения порядка.

Вывод:
В параллельном стриме findAny() может вернуть любой элемент, подходящий под условие. Если порядок не важен — используйте его для скорости.

⚡️ Не перепутайте:
В последовательном (sequential) стриме findAny() чаще всего тоже будет возвращать первый элемент, но спецификация этого не гарантирует.

#java #streamapi #parallel #performance #интервью #java_interview_tasks
👍6🔥1