🔍 Ответ на задачу про 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
❤5👍1🔥1
🔍 Ответ на задачу про Virtual Threads: Опасность synchronized 📌
В текущей реализации , начиная с Java 21 виртуальные потоки не могут освобождать системный (carrier) поток, если они находятся внутри
Вывод:
Системный поток будет заблокирован (ответ 2). Рекомендуется использовать
⚡️ Не перепутайте:
Это не значит, что
#java #java21 #virtualthreads #loom #concurrency #интервью #java_interview_tasks
В текущей реализации , начиная с Java 21 виртуальные потоки не могут освобождать системный (carrier) поток, если они находятся внутри
synchronized блока или вызывают нативный метод. Это называется Pinning. Если ваш код делает тяжелые сетевые вызовы внутри synchronized, вы можете забить все системные потоки и свести на нет всю пользу от виртуальных потоков.Вывод:
Системный поток будет заблокирован (ответ 2). Рекомендуется использовать
ReentrantLock, так как он не вызывает закрепления потока.⚡️ Не перепутайте:
Это не значит, что
synchronized — зло. Если операция внутри блока быстрая (просто инкремент), закрепление не будет проблемой.#java #java21 #virtualthreads #loom #concurrency #интервью #java_interview_tasks
👍4🔥1
🔍 Ответ на задачу про ReentrantLock: Попытка не пытка 🚪
Метод
Вывод:
Поток напечатает "Busy" и не будет блокироваться.
⚡️ Не перепутайте:
При использовании
#java #concurrency #multithreading #reentrantlock #интервью #java_interview_tasks
Метод
tryLock() — неблокирующий. Он мгновенно возвращает true, если замок удалось захватить, и false, если нет. Это позволяет потоку избежать ожидания и заняться чем-то другим или реализовать свою логику повторных попыток.Вывод:
Поток напечатает "Busy" и не будет блокироваться.
⚡️ Не перепутайте:
При использовании
lock() всегда вызывайте unlock() в блоке finally. Со synchronized об этом заботится сама JVM.#java #concurrency #multithreading #reentrantlock #интервью #java_interview_tasks
🔥4👍1🤨1
🔍 Ответ на задачу про Semaphore: Кто потерял ключи? 🔑
В отличие от многих других синхронизаторов,
Вывод:
Код напечатает 2. Это свойство часто используют для передачи сигналов между потоками: один поток ждет (
⚡️ Не перепутайте:
Если вам нужен строгий замок, где отдать ключ может только тот, кто его взял — используйте
#java #concurrency #semaphore #multithreading #интервью #java_interview_tasks
В отличие от многих других синхронизаторов,
Semaphore в Java — это просто счетчик. Метод release() просто увеличивает счетчик разрешений на единицу. Ему совершенно всё равно, вызывали ли вы acquire() до этого.Вывод:
Код напечатает 2. Это свойство часто используют для передачи сигналов между потоками: один поток ждет (
acquire), а другой подает сигнал о готовности (release).⚡️ Не перепутайте:
Если вам нужен строгий замок, где отдать ключ может только тот, кто его взял — используйте
ReentrantLock.#java #concurrency #semaphore #multithreading #интервью #java_interview_tasks
🔥4👍2❤1
🔍 Ответ на задачу про CountDownLatch vs CyclicBarrier: Одноразовый или нет? 🏁
-
-
Вывод:
⚡️ Не перепутайте:
- Нужен старт нескольких потоков одновременно?
- Нужно дождаться завершения инициализации чего-либо?
#java #concurrency #multithreading #latch #barrier #интервью #java_interview_tasks
-
CountDownLatch — одноразовый. Как только счетчик упал до нуля, все потоки проходят через await() свободно, и "взвести" его обратно нельзя.-
CyclicBarrier — многоразовый. После того как все потоки собрались в точке сбора, барьер сбрасывается и готов к следующему раунду (циклу). У него есть метод reset().Вывод:
CountDownLatch нельзя использовать повторно⚡️ Не перепутайте:
- Нужен старт нескольких потоков одновременно?
CyclicBarrier.- Нужно дождаться завершения инициализации чего-либо?
CountDownLatch.#java #concurrency #multithreading #latch #barrier #интервью #java_interview_tasks
❤4
🔍 Ответ на задачу про ThreadLocal: Утечка памяти в серверах 🚰
Веб-серверы используют ThreadPool. Поток не умирает после завершения запроса, а возвращается в пул. Если вы привязали к нему данные через
Вывод:
Объект останется в памяти. Всегда вызывайте
⚡️ Не перепутайте:
В современных Java (21+) для таких целей лучше использовать
#java #threadlocal #memoryleak #jvm #backend #интервью #java_interview_tasks
Веб-серверы используют ThreadPool. Поток не умирает после завершения запроса, а возвращается в пул. Если вы привязали к нему данные через
ThreadLocal и не удалили их, эти данные будут висеть в памяти вечно (или пока поток не будет пересоздан), так как на них есть ссылка из живого потока.Вывод:
Объект останется в памяти. Всегда вызывайте
threadLocal.remove() в блоке finally после завершения работы.⚡️ Не перепутайте:
В современных Java (21+) для таких целей лучше использовать
Scoped Values, которые гарантируют очистку данных после выхода из блока.#java #threadlocal #memoryleak #jvm #backend #интервью #java_interview_tasks
❤6👍3🔥2
🔍 Ответ на задачу про PhantomReference: 👻
Вывод:
Код выведет
⚡️ Не перепутайте:
-
-
-
#java #jvm #gc #memory #phantomreference #интервью #java_interview_tasks
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
🔍 Ответ на задачу про WeakHashMap:🧠
В
Вывод:
Запись будет удалена (ответ 2). Это отличное решение для временного хранения метаданных объектов, время жизни которых вы не контролируете.
⚡️ Не перепутайте:
Если вы сделаете слабым значение, а не ключ, мапа работать не будет —
#java #collections #weakhashmap #gc #memory #интервью #java_interview_tasks
В
WeakHashMap ключи хранятся как WeakReference. Если на объект-ключ больше никто не ссылается (кроме самой мапы), сборщик мусора имеет право его удалить. Мапа сама заметит исчезновение ключа и удалит соответствующую запись (включая значение).Вывод:
Запись будет удалена (ответ 2). Это отличное решение для временного хранения метаданных объектов, время жизни которых вы не контролируете.
⚡️ Не перепутайте:
Если вы сделаете слабым значение, а не ключ, мапа работать не будет —
WeakHashMap реагирует только на освобождение ключей.#java #collections #weakhashmap #gc #memory #интервью #java_interview_tasks
❤4👍2
🔍 Ответ на задачу про StringJoiner:
Вывод:
Результат:
⚡️ Не перепутайте:
Если вам нужно просто соединить строки через запятую без префиксов, используйте более лаконичный
#java #string #stringjoiner #clean_code #basics #интервью #java_interview_tasks
StringJoiner (Java 8) позволяет удобно собирать строки с разделителем, префиксом и суффиксом. Его главное преимущество — он сам следит за тем, чтобы разделитель НЕ ставился после последнего элемента.Вывод:
Результат:
[A, B].⚡️ Не перепутайте:
Если вам нужно просто соединить строки через запятую без префиксов, используйте более лаконичный
String.join(", ", list).#java #string #stringjoiner #clean_code #basics #интервью #java_interview_tasks
🔥3❤1👍1
🔍 Ответ на задачу про System.exit(): exit или finally? 🥊
Блок
Вывод:
Программа выведет только "Try " и завершится. Единственный способ выполнить код при выходе — использовать
⚡️ Не перепутайте:
Во всех остальных случаях (return, exception, break)
#java #jvm #finally #systemexit #basics #интервью #java_interview_tasks
Блок
finally гарантированно выполняется почти всегда. Но System.exit() - это другое). Он мгновенно останавливает работу всей виртуальной машины (JVM). В этом случае выполнение кода прерывается немедленно, и никакие finally блоки не запускаются.Вывод:
Программа выведет только "Try " и завершится. Единственный способ выполнить код при выходе — использовать
Runtime.getRuntime().addShutdownHook().⚡️ Не перепутайте:
Во всех остальных случаях (return, exception, break)
finally обязательно отработает.#java #jvm #finally #systemexit #basics #интервью #java_interview_tasks
👍4❤1🔥1🤔1😐1