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

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

По рекламе: @alexzelentsov
Download Telegram
🔍 Ответ на задачу про PECS: Producer Extends, Consumer Super 🦆
Это правило PECS:
- Producer Extends: Если коллекция "производит" данные (мы из нее читаем), используйте extends. Мы гарантируем, что там лежат объекты типа T или его наследники, поэтому их безопасно приводить к T.
- Consumer Super: Если коллекция "потребляет" данные (мы в нее пишем), используйте super. Мы можем безопасно положить туда T. Но при чтении мы получим только Object, так как не знаем реального типа.

Вывод:
Верна только строка A.

⚡️ Не перепутайте:
List<? extends T> — только для чтения.
List<? super T> — в основном для записи.

#java #generics #pecs #clean_code #интервью #java_interview_tasks
🔥5
### 🧮 Задача: (7x−y)(7y−z)(7z−x) = 11, где x, y, z — целые числа

### Решение: 🚫

Ключевое наблюдение — посмотрим на чётность произведения (7x−y)(7y−z)(7z−x).

Сложим все три множителя:

(7x − y) + (7y − z) + (7z − x) = 6x + 6y + 6z = 6(x + y + z)

Сумма трёх множителей всегда чётна (кратна 6). Если сумма трёх целых чисел чётна, то среди них либо все три чётные, либо ровно два нечётных и одно чётное. В обоих случаях хотя бы один множитель — чётный. А значит, произведение (7x−y)(7y−z)(7z−x) всегда чётно при любых целых x, y, z.

Но 11 — нечётное число.

### Вывод:
Уравнение не имеет решений в целых числах.

#math #numbertheory #diophantine #интервью #java_interview_tasks
🤔6👍3🔥2
🔍 Ответ на задачу про Method References: Неоднозначность 😵‍💫
Ссылка Service::process может быть интерпретирована двумя способами:
1. Как вызов статического метода: (Service s) -> Service.process(s).
2. Как вызов обычного метода у текущего элемента: (Service s) -> s.process().
Обе интерпретации идеально подходят под сигнатуру Consumer<Service>, который ожидает forEach. Компилятор не знает, какой метод выбрать.

Вывод:
Возникает ошибка компиляции из-за неоднозначности.

⚡️ Не перепутайте:
В таких случаях используйте обычную лямбду s -> s.process(), чтобы явно указать нужный метод.

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

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

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

#java #streamapi #parallel #performance #интервью #java_interview_tasks
👍6🔥1
🔍 Ответ на задачу про Stream.flatMap:
- map() превращает каждый элемент в другой элемент (1 -> 1). Если применить его здесь, мы получим стрим стримов: Stream<Stream<String>>.
- flatMap() превращает каждый элемент в стрим, а затем "склеивает" все эти стримы в один плоский Stream<String>.

Вывод:
Вместо двух вложенных списков мы получим один стрим из 3-х символов: "a", "b", "c". Результат count() — 3.

⚡️ Не перепутайте:
Используйте flatMap, когда ваш объект содержит коллекцию или Optional, и вы хотите работать с их содержимым напрямую.

#java #streamapi #flatmap #basics #интервью #java_interview_tasks
🔥2👌1
🔍 Ответ на задачу про Stream.reduce: Опасность identity 🚩
Первый аргумент reduce — это identity. Это значение, которое возвращается, если стрим пуст, и которое используется как начальное при вычислении.
Вычисление идет так: identity + element1 + element2...
В нашем случае: 10 + 1 + 2 + 3 = 16.

Вывод:
Напечатается 16. Если вы хотите просто сумму — identity должен быть 0. Если произведение — 1.

⚡️ Не перепутайте:
Identity должен быть нейтральным элементом для вашей операции. Для сложения это 0, для умножения 1, для конкатенации строк — пустая строка.

#java #streamapi #reduce #basics #интервью #java_interview_tasks
👍5❤1👌1
🔍 Ответ на задачу про LocalDate: Ловушка иммутабельности 📅
Классы из пакета java.time (LocalDate, LocalTime, etc.) — immutable (неизменяемые), как и String. Любой метод, который якобы "меняет" объект, на самом деле возвращает новый объект с измененным состоянием. Исходный объект date остается прежним.

Вывод:
Напечатается 1. Чтобы получить 11, нужно было написать date = date.plusDays(10).

⚡️ Не перепутайте:
Всегда проверяйте, что вы используете возвращаемое значение методов java.time. Это одна из самых частых ошибок при переходе со старого Calendar.

#java #datetime #immutable #bug #basics #интервью #java_interview_tasks
🔥7👏2❤1👍1
🔍 Ответ на задачу про Records: Компактный конструктор 📝
В рекордах (Java 16+) есть "компактный конструктор". У него нет круглых скобок с параметрами. Он автоматически получает те же параметры, что объявлены в заголовке рекорда. Это идеальное место для валидации или нормализации данных (например, name = name.trim()).

Вывод:
Код скомпилируется и выбросит исключение. Это правильный способ гарантировать валидность данных в Immutable записях.

⚡️ Не перепутайте:
В компактном конструкторе не нужно писать this.name = name, Java сделает это сама в конце.

#java #records #java17 #clean_code #basics #интервью #java_interview_tasks
👍8❤1🔥1