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

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

По рекламе: @alexzelentsov
Download Telegram
🔍 Ответ на задачу про Records: Компактный конструктор 📝
В рекордах (Java 16+) есть "компактный конструктор". У него нет круглых скобок с параметрами. Он автоматически получает те же параметры, что объявлены в заголовке рекорда. Это идеальное место для валидации или нормализации данных (например, name = name.trim()).

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

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

#java #records #java17 #clean_code #basics #интервью #java_interview_tasks
👍8❤1🔥1
Какой класс НЕ сможет наследоваться от `Shape`?
Anonymous Quiz
8%
Circle
7%
Square
62%
Triangle
23%
Все могут.
🔥3
Какой класс НЕ сможет наследоваться от Shape?
sealed class Shape permits Circle, Square { }
final class Circle extends Shape { }
non-sealed class Square extends Shape { }
class Triangle extends Shape { }
🔥3
🔍 Ответ на задачу про Sealed Classes: Закрытая иерархия 🔒
Ключевое слово 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
🔥3
Что выведет код?
int x = 1;
String result = switch (x) {
case 1 -> {
System.out.print("One");
yield "Result";
}
default -> "Other";
};
System.out.print(result);
🔥3
🔍 Ответ на задачу про Switch Expressions: yield или return? 🔄
В новых switch expressions (Java 14+) если вам нужно выполнить несколько действий в одном case, вы используете блок {}. Чтобы вернуть значение из такого блока наружу в переменную, используется ключевое слово yield.

Вывод:
Сначала выполнится System.out.print, затем значение "Result" вернется в переменную. Итого: OneResult.

⚡️ Не перепутайте:
yield используется только внутри switch. Не пытайтесь использовать его вместо return в обычных методах.

#java #switch #java14 #basics #syntax #интервью #java_interview_tasks
👌5
Что выведет этот код?
Object obj = "Hello Java";
if (obj instanceof String s && s.length() > 5) {
System.out.print(s.toUpperCase());
} else {
System.out.print("Short or not a string");
}
🔥3
🔍 Ответ на задачу про Pattern Matching: Прощай, кастинг! 👋
В 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
Собес в гугл:

3200021 разложить на множители
🔥4
Ответ на задачу про 3200021:

Заметим, что 32 · 100 000 = 3 200 000 = 20⁵ (потому что 32 = 2⁵, 100 000 = 10⁵, а 2⁵ · 10⁵ = 20⁵).
Тогда 3 200 021 = 20⁵ + 20 + 1, то есть это выражение x⁵ + x + 1 при x = 20.
Есть известное разложение:
x⁵ + x + 1 = (x² + x + 1)(x³ − x² + 1)
Подставляем x = 20:
x² + x + 1 = 400 + 20 + 1 = 421
x³ − x² + 1 = 8000 − 400 + 1 = 7601
7601 = 7700 − 99
7700 = 77 · 100 = 11 · 700
99 = 11 · 9
Значит, 7601 = 11 · (700 − 9) = 11 · 691.

Итого: 3 200 021 = 11 · 421 · 691.
🥴9🤨3🔥1
Как текстовые блоки \(Java 15\+\) определяют, где начинается контент, а где — просто отступы кода?
Сколько пробелов будет перед словом "Hello" в строке `result`?
Anonymous Quiz
30%
0
58%
2
7%
6
4%
4
👍3
Как текстовые блоки (Java 15+) определяют, где начинается контент, а где — просто отступы кода?
Сколько пробелов будет перед словом "Hello" в строке result?
String result = """
Hello
World
""";
👍3
🔍 Ответ на задачу про Text Blocks: Считаем пробелы 📏
Текстовые блоки используют "алгоритм смещения" (incidental whitespace). Java находит самую левую границу текста во всем блоке (в данном случае это начало слова "World") и считает её за "ноль". Всё, что находится левее этой границы, отбрасывается.

Вывод:
Так как "Hello" смещено на 2 пробела относительно "World", в итоговой строке перед ним останется именно 2 пробела.

⚡️ Не перепутайте:
Положение закрывающих кавычек """ тоже влияет на отступы! Если вы сдвинете их левее текста, это создаст дополнительные пробелы.

#java #java15 #textblocks #syntax #basics #интервью #java_interview_tasks
🔥6❤3👍1
Какая строка НЕ скомпилируется?
Anonymous Quiz
46%
Только 3
15%
3 и 4
21%
Только 4
18%
Все верны.
🤯4
Какая строка НЕ скомпилируется?
var a = 10;            // 1
var b = "Java"; // 2
var c = null; // 3
var d = (String) null; // 4
👍2🔥2
🔍 Ответ на задачу про var: Не всё так просто с null 🚫
Ключевое слово var (Java 10+) выводит тип переменной на основе инициализатора. Если мы пишем var c = null, компилятор не имеет ни малейшего представления, список это, строка или ваш кастомный класс. Поэтому такая запись запрещена.
Однако, если сделать явное приведение (String) null, тип становится известен, и var сработает.

Вывод:
Не скомпилируется только строка 3.

⚡️ Не перепутайте:
var — это не динамическая типизация как в JS. Тип определяется один раз при компиляции и не может быть изменен позже.

#java #java10 #var #inference #basics #интервью #java_interview_tasks
❤5👍1🔥1
🔍 Ответ на задачу про Virtual Threads: Опасность synchronized 📌
В текущей реализации , начиная с Java 21 виртуальные потоки не могут освобождать системный (carrier) поток, если они находятся внутри synchronized блока или вызывают нативный метод. Это называется Pinning. Если ваш код делает тяжелые сетевые вызовы внутри synchronized, вы можете забить все системные потоки и свести на нет всю пользу от виртуальных потоков.

Вывод:
Системный поток будет заблокирован (ответ 2). Рекомендуется использовать ReentrantLock, так как он не вызывает закрепления потока.

⚡️ Не перепутайте:
Это не значит, что synchronized — зло. Если операция внутри блока быстрая (просто инкремент), закрепление не будет проблемой.

#java #java21 #virtualthreads #loom #concurrency #интервью #java_interview_tasks
👍4🔥1