🔍 Ответ на задачу про Wildcards: List<Object> vs List<?> ❓
1.
2.
3. В
Вывод:
Не скомпилируются строки 1 и 3.
⚡️ Не перепутайте:
#java #generics #wildcards #basics #интервью #java_interview_tasks
1.
List<Object> не является родителем для List<String>. Несмотря на то, что String — это Object, сами коллекции инвариантны. Иначе мы могли бы положить Integer в список строк через ссылку на List<Object>.2.
List<?> (wildcard) — это родитель для любого List. Строка 2 верна.3. В
List<?> нельзя ничего добавлять (кроме null), так как мы не знаем, список какого типа там на самом деле.Вывод:
Не скомпилируются строки 1 и 3.
⚡️ Не перепутайте:
List<Object> — это список, в который можно класть любые объекты.List<?> — это список какого-то неизвестного типа, из него можно только читать.#java #generics #wildcards #basics #интервью #java_interview_tasks
✍6👍4👏1
🔍 Ответ на задачу про PECS: Producer Extends, Consumer Super 🦆
Это правило PECS:
- Producer Extends: Если коллекция "производит" данные (мы из нее читаем), используйте
- Consumer Super: Если коллекция "потребляет" данные (мы в нее пишем), используйте
Вывод:
Верна только строка A.
⚡️ Не перепутайте:
#java #generics #pecs #clean_code #интервью #java_interview_tasks
Это правило 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 — целые числа
### Решение: 🚫
Ключевое наблюдение — посмотрим на чётность произведения
Сложим все три множителя:
Сумма трёх множителей всегда чётна (кратна 6). Если сумма трёх целых чисел чётна, то среди них либо все три чётные, либо ровно два нечётных и одно чётное. В обоих случаях хотя бы один множитель — чётный. А значит, произведение
Но 11 — нечётное число.
### Вывод:
Уравнение не имеет решений в целых числах.
#math #numbertheory #diophantine #интервью #java_interview_tasks
### Решение: 🚫
Ключевое наблюдение — посмотрим на чётность произведения
(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: Неоднозначность 😵💫
Ссылка
1. Как вызов статического метода:
2. Как вызов обычного метода у текущего элемента:
Обе интерпретации идеально подходят под сигнатуру
Вывод:
Возникает ошибка компиляции из-за неоднозначности.
⚡️ Не перепутайте:
В таких случаях используйте обычную лямбду
#java #lambda #methodreference #bug #интервью #java_interview_tasks
Ссылка
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
🔥5👍2👌1
🔍 Ответ на задачу про Stream.findFirst vs findAny: В чём разница? 🔍
-
-
Вывод:
В параллельном стриме
⚡️ Не перепутайте:
В последовательном (sequential) стриме
#java #streamapi #parallel #performance #интервью #java_interview_tasks
-
findFirst() жестко привязан к порядку следования (encounter order). В параллельном стриме он потратит время на то, чтобы убедиться, что вернул именно первый элемент.-
findAny() позволяет среде выполнения выбрать любой подходящий элемент. В параллельных стримах это работает гораздо быстрее, так как не нужно координировать потоки для соблюдения порядка.Вывод:
В параллельном стриме
findAny() может вернуть любой элемент, подходящий под условие. Если порядок не важен — используйте его для скорости.⚡️ Не перепутайте:
В последовательном (sequential) стриме
findAny() чаще всего тоже будет возвращать первый элемент, но спецификация этого не гарантирует.#java #streamapi #parallel #performance #интервью #java_interview_tasks
👍6🔥1
🔍 Ответ на задачу про Stream.flatMap:
-
-
Вывод:
Вместо двух вложенных списков мы получим один стрим из 3-х символов: "a", "b", "c". Результат
⚡️ Не перепутайте:
Используйте
#java #streamapi #flatmap #basics #интервью #java_interview_tasks
-
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: Опасность
Первый аргумент
Вычисление идет так:
В нашем случае:
Вывод:
Напечатается 16. Если вы хотите просто сумму — identity должен быть 0. Если произведение — 1.
⚡️ Не перепутайте:
Identity должен быть нейтральным элементом для вашей операции. Для сложения это 0, для умножения 1, для конкатенации строк — пустая строка.
#java #streamapi #reduce #basics #интервью #java_interview_tasks
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: Ловушка иммутабельности 📅
Классы из пакета
Вывод:
Напечатается 1. Чтобы получить 11, нужно было написать
⚡️ Не перепутайте:
Всегда проверяйте, что вы используете возвращаемое значение методов
#java #datetime #immutable #bug #basics #интервью #java_interview_tasks
Классы из пакета
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+) есть "компактный конструктор". У него нет круглых скобок с параметрами. Он автоматически получает те же параметры, что объявлены в заголовке рекорда. Это идеальное место для валидации или нормализации данных (например,
Вывод:
Код скомпилируется и выбросит исключение. Это правильный способ гарантировать валидность данных в Immutable записях.
⚡️ Не перепутайте:
В компактном конструкторе не нужно писать
#java #records #java17 #clean_code #basics #интервью #java_interview_tasks
В рекордах (Java 16+) есть "компактный конструктор". У него нет круглых скобок с параметрами. Он автоматически получает те же параметры, что объявлены в заголовке рекорда. Это идеальное место для валидации или нормализации данных (например,
name = name.trim()).Вывод:
Код скомпилируется и выбросит исключение. Это правильный способ гарантировать валидность данных в Immutable записях.
⚡️ Не перепутайте:
В компактном конструкторе не нужно писать
this.name = name, Java сделает это сама в конце.#java #records #java17 #clean_code #basics #интервью #java_interview_tasks
👍8❤1🔥1
🔍 Ответ на задачу про Sealed Classes: Закрытая иерархия 🔒
Ключевое слово
Наследники
Вывод:
⚡️ Не перепутайте:
Sealed-классы отлично работают вместе с Pattern Matching в
#java #java17 #sealedclasses #oop #basics #интервью #java_interview_tasks
Ключевое слово
sealed (Java 17) разрешает наследование только тем классам, которые перечислены в списке permits. Любой другой класс (как Triangle) получит ошибку компиляции при попытке расширить Shape.Наследники
sealed класса обязаны быть либо final, либо sealed, либо non-sealed (открывающим иерархию обратно).Вывод:
Triangle нет в списке разрешенных. Поэтому вариант с Triangle не скомпилируется.⚡️ Не перепутайте:
Sealed-классы отлично работают вместе с Pattern Matching в
switch, позволяя компилятору проверять, все ли возможные подтипы вы обработали.#java #java17 #sealedclasses #oop #basics #интервью #java_interview_tasks
✍5
🔍 Ответ на задачу про Switch Expressions: yield или return? 🔄
В новых switch expressions (Java 14+) если вам нужно выполнить несколько действий в одном
Вывод:
Сначала выполнится
⚡️ Не перепутайте:
#java #switch #java14 #basics #syntax #интервью #java_interview_tasks
В новых switch expressions (Java 14+) если вам нужно выполнить несколько действий в одном
case, вы используете блок {}. Чтобы вернуть значение из такого блока наружу в переменную, используется ключевое слово yield.Вывод:
Сначала выполнится
System.out.print, затем значение "Result" вернется в переменную. Итого: OneResult.⚡️ Не перепутайте:
yield используется только внутри switch. Не пытайтесь использовать его вместо return в обычных методах.#java #switch #java14 #basics #syntax #интервью #java_interview_tasks
👌5
🔍 Ответ на задачу про Pattern Matching: Прощай, кастинг! 👋
В Java 16 появился Pattern Matching for instanceof. Теперь мы можем объявить переменную
Вывод:
Так как длина строки 10 (> 5), условие сработает. Результат:
⚡️ Не перепутайте:
Переменная
#java #java16 #patternmatching #basics #syntax #интервью #java_interview_tasks
В Java 16 появился Pattern Matching for instanceof. Теперь мы можем объявить переменную
s прямо в проверке. Если obj является строкой, Java сама сделает приведение типов и запишет результат в s. Область видимости s ограничена блоком if.Вывод:
Так как длина строки 10 (> 5), условие сработает. Результат:
HELLO JAVA.⚡️ Не перепутайте:
Переменная
s доступна только там, где компилятор уверен в её инициализации. Например, в if (...) { здесь s доступна }.#java #java16 #patternmatching #basics #syntax #интервью #java_interview_tasks
✍5
🔍 Ответ на задачу про Text Blocks: Считаем пробелы 📏
Текстовые блоки используют "алгоритм смещения" (incidental whitespace). Java находит самую левую границу текста во всем блоке (в данном случае это начало слова "World") и считает её за "ноль". Всё, что находится левее этой границы, отбрасывается.
Вывод:
Так как "Hello" смещено на 2 пробела относительно "World", в итоговой строке перед ним останется именно 2 пробела.
⚡️ Не перепутайте:
Положение закрывающих кавычек
#java #java15 #textblocks #syntax #basics #интервью #java_interview_tasks
Текстовые блоки используют "алгоритм смещения" (incidental whitespace). Java находит самую левую границу текста во всем блоке (в данном случае это начало слова "World") и считает её за "ноль". Всё, что находится левее этой границы, отбрасывается.
Вывод:
Так как "Hello" смещено на 2 пробела относительно "World", в итоговой строке перед ним останется именно 2 пробела.
⚡️ Не перепутайте:
Положение закрывающих кавычек
""" тоже влияет на отступы! Если вы сдвинете их левее текста, это создаст дополнительные пробелы.#java #java15 #textblocks #syntax #basics #интервью #java_interview_tasks
🔥6❤3👍1
🔍 Ответ на задачу про var: Не всё так просто с null 🚫
Ключевое слово
Однако, если сделать явное приведение
Вывод:
Не скомпилируется только строка 3.
⚡️ Не перепутайте:
#java #java10 #var #inference #basics #интервью #java_interview_tasks
Ключевое слово
var (Java 10+) выводит тип переменной на основе инициализатора. Если мы пишем var c = null, компилятор не имеет ни малейшего представления, список это, строка или ваш кастомный класс. Поэтому такая запись запрещена.Однако, если сделать явное приведение
(String) null, тип становится известен, и var сработает.Вывод:
Не скомпилируется только строка 3.
⚡️ Не перепутайте:
var — это не динамическая типизация как в JS. Тип определяется один раз при компиляции и не может быть изменен позже.#java #java10 #var #inference #basics #интервью #java_interview_tasks
❤3👍1🔥1