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

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

По рекламе: @alexzelentsov
Download Telegram
🔍 Ответ на задачу про CountDownLatch vs CyclicBarrier: Одноразовый или нет? 🏁
- CountDownLatch — одноразовый. Как только счетчик упал до нуля, все потоки проходят через await() свободно, и "взвести" его обратно нельзя.
- CyclicBarrier — многоразовый. После того как все потоки собрались в точке сбора, барьер сбрасывается и готов к следующему раунду (циклу). У него есть метод reset().

Вывод:
CountDownLatch нельзя использовать повторно

⚡️ Не перепутайте:
- Нужен старт нескольких потоков одновременно? CyclicBarrier.
- Нужно дождаться завершения инициализации чего-либо? CountDownLatch.

#java #concurrency #multithreading #latch #barrier #интервью #java_interview_tasks
❤4
🔍 Ответ на задачу про ThreadLocal: Утечка памяти в серверах 🚰
Веб-серверы используют ThreadPool. Поток не умирает после завершения запроса, а возвращается в пул. Если вы привязали к нему данные через ThreadLocal и не удалили их, эти данные будут висеть в памяти вечно (или пока поток не будет пересоздан), так как на них есть ссылка из живого потока.

Вывод:
Объект останется в памяти. Всегда вызывайте threadLocal.remove() в блоке finally после завершения работы.

⚡️ Не перепутайте:
В современных Java (21+) для таких целей лучше использовать Scoped Values, которые гарантируют очистку данных после выхода из блока.

#java #threadlocal #memoryleak #jvm #backend #интервью #java_interview_tasks
❤6👍3🔥2
🔥3
Что вернет метод phantomRef.get()?
Object obj = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);
System.out.println(phantomRef.get());
👍3
🔍 Ответ на задачу про PhantomReference: 👻
PhantomReference спроектирована так, что её метод get() всегда возвращает null. Её единственная цель — узнать момент, когда объект был окончательно удален из памяти, через специальную очередь ReferenceQueue. Это гораздо безопаснее и гибче, чем устаревший метод finalize().

Вывод:
Код выведет null. Фантомные ссылки используют для очистки ресурсов вне кучи (off-heap memory), когда мы точно знаем, что Java-объект уже "мертв".

⚡️ Не перепутайте:
- WeakReference: удаляется при ближайшей сборке мусора.
- SoftReference: удаляется только при нехватке памяти.
- PhantomReference: объект уже удален, ссылка нужна только для уведомления.

#java #jvm #gc #memory #phantomreference #интервью #java_interview_tasks
❤2👍2🔥1🤨1
Что произойдет с записью в мапе, если на её КЛЮЧ не осталось сильных ссылок?
Map<Object, String> map = new WeakHashMap<>();
Object key = new Object();
map.put(key, "data");
key = null; //удаляем ссылку

System.gc(); //Форсируем сборку мусора
👍3🔥1🤔1💩1
🔍 Ответ на задачу про WeakHashMap:🧠
В WeakHashMap ключи хранятся как WeakReference. Если на объект-ключ больше никто не ссылается (кроме самой мапы), сборщик мусора имеет право его удалить. Мапа сама заметит исчезновение ключа и удалит соответствующую запись (включая значение).

Вывод:
Запись будет удалена (ответ 2). Это отличное решение для временного хранения метаданных объектов, время жизни которых вы не контролируете.

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

#java #collections #weakhashmap #gc #memory #интервью #java_interview_tasks
❤4👍2
Что выведет этот код?
Anonymous Quiz
5%
A, B
75%
[A, B]
18%
[A, B,]
2%
A, B,
🔥4👍1
Что выведет этот код?
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.add("A").add("B");
System.out.println(joiner.toString());
👍5🔥1
🔍 Ответ на задачу про StringJoiner:
StringJoiner (Java 8) позволяет удобно собирать строки с разделителем, префиксом и суффиксом. Его главное преимущество — он сам следит за тем, чтобы разделитель НЕ ставился после последнего элемента.

Вывод:
Результат: [A, B].

⚡️ Не перепутайте:
Если вам нужно просто соединить строки через запятую без префиксов, используйте более лаконичный String.join(", ", list).

#java #string #stringjoiner #clean_code #basics #интервью #java_interview_tasks
🔥4👍2❤1
Что выведет этот код?
Anonymous Quiz
34%
Try Finally
58%
Try
6%
Finally
3%
Ошибка компиляции.
🔥3👍2🤔1
Что выведет этот код?
try {
System.out.print("Try ");
System.exit(0);
} finally {
System.out.print("Finally");
}
🤔5👍1🔥1
🔍 Ответ на задачу про System.exit(): exit или finally? 🥊

Блок finally гарантированно выполняется почти всегда. Но System.exit() - это другое). Он мгновенно останавливает работу всей виртуальной машины (JVM). В этом случае выполнение кода прерывается немедленно, и никакие finally блоки не запускаются.

Вывод:
Программа выведет только "Try " и завершится. Единственный способ выполнить код при выходе — использовать Runtime.getRuntime().addShutdownHook().

⚡️ Не перепутайте:
Во всех остальных случаях (return, exception, break) finally обязательно отработает.

#java #jvm #finally #systemexit #basics #интервью #java_interview_tasks
👍5❤2🔥1🤔1😐1
Можно ли десериализовать объект, если в новой версии класса добавилось одно поле, но `serialVersionUID` остался прежним?
Anonymous Quiz
17%
Нет, будет выброшен InvalidClassException.
47%
Да, новое поле просто получит значение по умолчанию (null или 0).
36%
Да, но только если поле помечено как `transient`.
0%
JVM упадет с ошибкой сегментации.
❤2👍2🔥1
🔍 Ответ на задачу про Serialization: Зачем нужен serialVersionUID? 🆔
serialVersionUID — это "версия" вашего класса для механизма сериализации. Если он совпадает, Java попытается сопоставить поля. Новые поля в классе просто заполнятся нулями, а лишние поля из потока данных будут проигнорированы.
Если же serialVersionUID не указан, Java вычислит его сама на основе структуры класса. Тогда любое мелкое изменение (даже переименование метода) изменит ID и сделает старые данные нечитаемыми.

Вывод:
Да, десериализация пройдет успешно (ответ 2). Всегда указывайте serialVersionUID вручную, чтобы контролировать совместимость.

#java #serialization #backend #basics #интервью #java_interview_tasks
❤2👍1🔥1🤔1
Что происходит с полями, помеченными как `transient`, при сохранении объекта?
Что увидит программа после десериализации?
Anonymous Quiz
7%
login="admin", password="123"
73%
login="admin", password=null
17%
login=null, password=null
2%
Ошибка при десериализации.
🤔3👍2🔥1
Что происходит с полями, помеченными как transient, при сохранении объекта?
Что увидит программа после десериализации?
class User implements Serializable {
String login = "admin";
transient String password = "123";
}
👍2🔥1🤔1
🔍 Ответ на задачу про transient:
Ключевое слово transient говорит механизму сериализации: "Игнорируй это поле". Оно не будет записано в поток байтов. При десериализации такое поле получит стандартное значение для своего типа (null для объектов, 0 для чисел, false для boolean).

Вывод:
Пароль будет потерян (null). Это полезно для чувствительных данных (пароли, ключи) или для тяжелых объектов, которые проще пересоздать, чем сохранять (например, кэши или ссылки на открытые файлы).

⚡️ Не перепутайте:
Статические поля (static) тоже не сериализуются, так как они принадлежат классу, а не объекту.

#java #serialization #transient #security #basics #интервью #java_interview_tasks
👍3🔥2❤1