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

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

По рекламе: @alexzelentsov
Download Telegram
🔍 Ответ на задачу про Integer: Когда 100 == 100, а 1000 != 1000? 🧐

Многие начинающие (и не только) джависты спотыкаются на сравнении объектов-оберток через ==.
Объяснение:
В Java существует Integer Cache. При автоупаковке (autoboxing) вызывается метод Integer.valueOf(int).
Для экономии памяти JVM кеширует объекты Integer в диапазоне от -128 до 127.
Поэтому a и b ссылаются на один и тот же объект в кеше — и == возвращает true.
Для числа 1000 кеша нет, создаются два разных объекта в куче — и == (сравнение ссылок) возвращает false.

Вывод:
Никогда не сравнивайте объекты-обертки через ==, если только вы не хотите проверить идентичность ссылок.

⚡️ Не перепутайте:
- Для сравнения значений объектов всегда используйте .equals().
- Помните, что верхнюю границу кеша можно изменить через флаг -XX:AutoBoxCacheMax=<size>.

Хочешь больше таких нюансов? Ставь 🔥 и делись с коллегами!
#java #integer #cache #jvm #autoboxing #interview #java_interview_tasks
👍7🔥7❤1
Что выведет данный код?
Anonymous Quiz
15%
true, true
12%
false, false
66%
false, true
8%
true, false
👍4
Что выведет данный код?
String s1 = "Java";
String s2 = new String("Java");
String s3 = s2.intern();
System.out.println(s1 == s2);
System.out.println(s1 == s3);
👍4
🔍 Ответ на задачу про String Pool: Магия intern() или где живет ваша строка? 🧵

Сравнение строк в Java через == — это классика интервью. Но что произойдет, если мы начнем вручную управлять пулом строк?

Объяснение:
- s1 — это строковый литерал, он сразу попадает в String Pool.
- s2 создается через new String(), поэтому в куче (heap) создается новый объект, отличный от того, что в пуле. Сравнение s1 == s2 дает false.
- Метод intern() ищет строку в пуле. Если она там есть, он возвращает ссылку на объект из пула. Так как "Java" уже там была (от s1), s3 получит ту же самую ссылку.

Вывод:
s1 == s3 вернет true, так как обе переменные теперь ссылаются на один и тот же объект в String Pool.

⚡️ Не перепутайте:
- == сравнивает ссылки.
- equals() сравнивает содержимое.
- intern() — полезный инструмент для экономии памяти, если у вас много повторяющихся строк, созданных динамически.

#java #string #stringpool #intern #jvm #interview #java_interview_tasks
1👍6
🔍 Ответ на задачу про CompletableFuture: join() vs get() 🥊
Объяснение:
Оба метода ждут завершения задачи, но делают это по-разному.
get() объявлен в интерфейсе Future и выбрасывает InterruptedException и ExecutionException (оба checked). Это заставляет вас писать try-catch.
join() — это метод CompletableFuture, он выбрасывает CompletionException (runtime), что гораздо удобнее при использовании в Stream API и лямбдах.

Вывод:
Логика ожидания у них одинаковая, разница только в обработке ошибок.

#java #completablefuture #concurrency #exception #java8 #backend #интервью #java_interview_tasks
🔥7
В каком порядке выведутся цифры?
Anonymous Quiz
17%
123456
55%
142356
17%
415623
10%
145623
👍3🔥1
Понимание порядка инициализации полей и блоков — база для предсказания поведения сложных объектов.
В каком порядке выведутся цифры?

class Parent {
static { System.out.print("1"); }
{ System.out.print("2"); }
Parent() { System.out.print("3"); }
}
class Child extends Parent {
static { System.out.print("4"); }
{ System.out.print("5"); }
Child() { System.out.print("6"); }
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
👻4
🔍 Ответ на задачу про порядок инициализации: Кто первый — блок или конструктор? 🏗
Правило:
1. Сначала статические блоки родителя, потом ребенка (при первой загрузке класса).
2. Затем нестатические блоки родителя и его конструктор.
3. Только после этого нестатические блоки ребенка и его конструктор.

Вывод:
Сначала статика: 1, 4. Затем родитель: 2, 3. Затем ребенок: 5, 6. Итого: 142356.

⚡️ Не перепутайте:
Статика выполняется только один раз при загрузке класса, а обычные блоки — при каждом создании объекта перед конструктором.

#java #initialization #static #constructor #oop #интервью #java_interview_tasks
❤5👍5🔥1🐳1
Что напечатает программа, если и `close()`, и тело `try` кидают исключения?
Anonymous Quiz
27%
Close Error
31%
Try Error
29%
Try Error и Close Error
13%
Ошибка компиляции.
🔥4👍1
Механизм try-with-resources (Java 7+) сильно упростил жизнь, но у него есть нюанс с "подавленными" (suppressed) исключениями.
Что напечатает программа, если и close(), и тело try кидают исключения?

class Door implements AutoCloseable {
public void close() { throw new RuntimeException("Close Error"); }
}
try (Door d = new Door()) {
throw new RuntimeException("Try Error");
} catch (Exception e) {
System.out.println(e.getMessage());
}
🔥5❤3
🔍 Ответ на задачу про try-with-resources: Куда делось исключение? 🛡
В try-with-resources основным считается исключение, возникшее в блоке try. Если при автоматическом закрытии ресурсов тоже возникнет исключение, оно не затрет основное, а будет добавлено в список "подавленных" (доступно через e.getSuppressed()).

Вывод:
Метод getMessage() вернет только основное исключение — "Try Error".

⚡️ Не перепутайте:
В старом стиле (через finally) исключение из finally могло "проглотить" исключение из try. Try-with-resources решает эту проблему.

#java #exceptions #trywithresources #suppressed #clean_code #интервью #java_interview_tasks
🔥3👀1
Есть ли тут ЛОГИЧЕСКИЙ баг?
🤔3🔥2👍1
🔍 Ответ на задачу про SQL: LEFT JOIN + WHERE — скрытый баг 🐛
LEFT JOIN гарантирует, что все строки из левой таблицы (customers) попадут в результат, даже если в правой таблице (products) нет совпадений — в этом случае столбцы правой таблицы заполняются NULL.

Однако условие WHERE p.status = 'SHIPPED' отфильтровывает все строки, где p.status IS NULL. Это означает, что клиенты без заказов будут исключены из результата, и LEFT JOIN фактически превратится в INNER JOIN.

Вывод:
WHERE по правой таблице превращает LEFT JOIN в INNER JOIN.
Чтобы сохранить поведение LEFT JOIN, условие фильтрации нужно перенести в ON:

SELECT   c.NAME,
p.product_id
FROM customers c
LEFT JOIN products p
ON c.id = p.customer_id
AND p.status = 'SHIPPED';


#sql #leftjoin #where #bug #database #интервью #java_interview_tasks
🔥4👍2👎2
🔥4👍2❤1
Оператор instanceof кажется простым, но его поведение с null иногда застает врасплох.
Что выведет код?

String s = null;
System.out.println(s instanceof String);
System.out.println(s instanceof Object);
👍6🔥2
🔍 Ответ на задачу про instanceof: А если там null? 🧐
Согласно спецификации Java, оператор instanceof всегда возвращает false, если левый операнд равен null. При этом никакой ошибки (NPE) не возникает.

Вывод:
Оба сравнения вернут false. null не является экземпляром ни одного класса, даже Object.

⚡️ Не перепутайте:
Вам не нужно проверять s != null перед использованием instanceof. Сам оператор уже делает эту проверку за вас.

#java #instanceof #null #basics #интервью #java_interview_tasks
🔥9👍1👀1
Что вернет метод `thenRun()`, если предыдущий этап вернул строку "Success"?
Anonymous Quiz
20%
CompletableFuture<String> со значением "Success".
50%
CompletableFuture<Void>.
24%
CompletableFuture<String> со значением "Done".
7%
Результат будет null.
🔥3👍1👀1
Асинхронное программирование — мощная концепция, но важно понимать разницу в цепочках методов.
Что вернет метод thenRun(), если предыдущий этап вернул строку "Success"?

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Success");
CompletableFuture<Void> result = future.thenRun(() -> System.out.println("Done"));
👍3🔥3❤1
🔍 Ответ на задачу про CompletableFuture: thenRun, thenAccept или thenApply? 🚀
- thenApply(Function) — принимает результат, возвращает новый результат (меняет тип).
- thenAccept(Consumer) — принимает результат, ничего не возвращает (CompletableFuture<Void>).
- thenRun(Runnable) — не принимает результат и ничего не возвращает (CompletableFuture<Void>). Используется просто для запуска кода после завершения этапа.

Вывод:
thenRun всегда возвращает CompletableFuture<Void>, игнорируя результат предыдущего шага.

⚡️ Не перепутайте:
Выбирайте метод в зависимости от того, нужны ли вам входные данные от предыдущего шага и хотите ли вы что-то передать дальше.

#java #concurrency #completablefuture #async #multithreading #интервью #java_interview_tasks
👍6❤3🔥1
Что произойдет, если внутри `computeIfAbsent` попытаться изменить эту же мапу?
Anonymous Quiz
10%
Мапа будет содержать {A=1, B=2, C=3}.
77%
ConcurrentModificationException.
7%
Зацикливание (Infinite Loop).
5%
Ошибка компиляции.
👍4🔥1👀1