Посты канала Java Interview Review

Этот Telegram-канал является приватным.
Популярные вопросы и ответы с собеседований на Java-разработчика.
Канал для Android-разработчиков @AndroidSobes
Связаться с нами @SobesAdmin
http://itsobes.ru/
Канал для Android-разработчиков @AndroidSobes
Связаться с нами @SobesAdmin
http://itsobes.ru/
7,563 подписчиков
17 фото
Последнее обновление 11.03.2025 07:43
Похожие каналы

10,531 подписчиков

4,181 подписчиков

3,579 подписчиков

3,294 подписчиков

3,292 подписчиков

2,752 подписчиков

2,626 подписчиков

1,605 подписчиков
Последний контент, опубликованный в Java Interview Review на Telegram
The owner of this channel has been inactive for the last 11 months. If they remain inactive for the next 19 days, they may lose their account and admin rights in this channel. The contents of the channel will remain accessible for all users.
Что такое synchronized?
Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется
Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока
Блок
#Язык
#Многопоточность
Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется
this
, статического – .class
текущего класса.Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока
synchronized
на одном и том же объекте. Такая блокировка называется intrinsic lock или monitor lock, подробно рассматривается в Java Concurrency in Practice 2.3.1.Блок
synchronized
также необходим для использования методов wait, notify, notifyAll.#Язык
#Многопоточность
Чем отличаются checked и unchecked исключения?
Вопрос формулируют по-разному, суть вопроса – объяснение иерархии классов исключений. Подробно описано в документации.
Исключения бывают checked и unchecked. Checked требуется указывать в сигнатуре метода в разделе
🔘
🔘
🔘
🔘
#Язык
Вопрос формулируют по-разному, суть вопроса – объяснение иерархии классов исключений. Подробно описано в документации.
Исключения бывают checked и unchecked. Checked требуется указывать в сигнатуре метода в разделе
throws
; перехватывать или добавлять в throws
в вызывающем его методе. Unchecked можно добавить, но не обязательно, перехватывать не обязательно даже если указана в throws
. 🔘
Throwable
– базовый класс для всего что может быть использовано с оператором throw
и в конструкции try-catch🔘
RuntimeException
– «нормальные» unchecked-исключения🔘
Error
– unchecked исключения, которые означают «серьезные проблемы» приложения. Не должны обрабатываться (хотя технически можно). Теоретически JVM может находиться в невалидном состоянии и не давать больше никаких гарантий🔘
Exception
(кроме RuntimeException
) – checked исключения#Язык
Какие бывают модификаторы?
🔘 Модификаторы доступа
🔘 Модификаторы для многопоточности
🔘
🔘 final
🔘
🔘
🔘
🔘
#Язык
🔘 Модификаторы доступа
private
, protected
, public
(рассмотрим подробнее в разделе #Классы)🔘 Модификаторы для многопоточности
synchronized
и volatile
(подробнее чуть позже)🔘
static
(рассмотрим подробнее в разделе #Классы)🔘 final
🔘
abstract
(рассмотрим подробнее в разделе #Классы)🔘
native
– реализация метода скрыта внутри JVM, нельзя указывать в пользовательском коде🔘
transient
– поле будет пропущено при сериализации🔘
strictfp
– самый экзотический, ограничивает точность вычисления для переменной с плавающей точкой до стандарта IEEE. Нужно для переносимости между платформами.#Язык
Какие существуют литералы?
Литерал – последовательность символов, обозначающая значение примитивного типа (или строки).
🔘 Целочисленные (Integer). Возможные форматы:
🔘 С плавающей точкой (floating-point). Возможные форматы:
🔘 Символы и строки. Символ (char) – в одинарных кавычках:
🔘 Логические (boolean).
🔘 Специальный литерал
Все нюансы описаны в официальной документации.
#Язык
Литерал – последовательность символов, обозначающая значение примитивного типа (или строки).
🔘 Целочисленные (Integer). Возможные форматы:
2019
, 1__000_000
(с Java 7), 10048L
(можно l, но будет путаться с 1), 0xfd12aa
, 0b1011101
, 07654321
.🔘 С плавающей точкой (floating-point). Возможные форматы:
123.4
, 56.7e8
, .07
, 42F
, 1.4D
(избыточно, по умолчанию и так double).🔘 Символы и строки. Символ (char) – в одинарных кавычках:
'R'
. Спецсимволы пишутся с бэкслешем: '\n'
. Любой символ можно представлять в виде escape-последовательности: '\u00F1'
. Строковый литерал – последовательность символов в двойных кавычках: "Blabla"
. Для символов строки действуют те же правила.🔘 Логические (boolean).
true
и false
.🔘 Специальный литерал
null
.Все нюансы описаны в официальной документации.
#Язык
Чем отличается final finally finalize? (2/2)
Любое исключение, выброшенное из блока
После выполнится блок
Для требующих финализации классов («ресурсов») добавляется интерфейс
#Язык
finally
– часть языковой конструкции try-catch-finally.Любое исключение, выброшенное из блока
try
переводит исполнение в самый соответствующий ему catch
(при наличии). Этим продиктована необходимость располагать блоки catch
в строгом порядке, от типа исключения-наследника, к родителю. В случае multicatch тот же порядок должен соблюдаться и внутри одного catch. Больше примеров про порядок. После выполнится блок
finally
. Выполняется он в любом случае, было исключение или нет. Типичное использование – освобождение ресурсов, обязательные завершающие действия.Для требующих финализации классов («ресурсов») добавляется интерфейс
AutoCloseable
, повторяющийся код блока final
выносится в метод close
и вызывается неявно в конце try-with-resources. Если в этой конструкции присутствует и явный final
, он будет выполнен после.#Язык
Чем отличается final finally finalize? (1/2)
Тем, что это даже синтаксически разные вещи. Как и вопрос о методах Object, это способ начать разговор.
Когда в методе используется локальная переменная внешней области видимости, она обязана быть effectively final. В этом случае ключевое слово final необязательно, но значение всё равно не должно меняться.
#Язык
Тем, что это даже синтаксически разные вещи. Как и вопрос о методах Object, это способ начать разговор.
finalize
– метод-финализатор из Object
, мы уже рассмотрели в предыдущих постах.final
– модификатор, который применяется к переменным, полям, методам и классам. Переменная или поле становится неизменяемым и требует инициализации. Финальный метод нельзя переопределить в наследниках. Финальный класс не может иметь наследников вообще. Используется для создания хорошего (Effective Java Item 15) API по принципу наименьших привилегий.Когда в методе используется локальная переменная внешней области видимости, она обязана быть effectively final. В этом случае ключевое слово final необязательно, но значение всё равно не должно меняться.
#Язык
wait, notify, notifyAll
Часто этот вопрос формулируется как задача Producer-сonsumer. Эту задачу и практические задачи на многопоточность вообще при возможности лучше реализовывать на высокоуровневых примитивах синхронизации. Другой подход – воспользоваться также низкоуровневой, но оптимистической блокировкой на compareAndSet. Но обычно использование
Эти методы вместе с
Чтобы вызывать эти методы у объекта, необходимо чтобы был захвачен его монитор (т.е. нужно быть внутри synchronized-блока на этом объекте). В противном случае будет выброшено
Вызов
В теории, ожидание wait может быть прервано без вызова
Еще два нештатных случая завершения
Различные проблемы реализации блокировок рассмотрены в Java Concurrency in Practice 14.1.3, 14.2. Для желающих разобраться, как блокировки работают в кишках JVM, написана статья на хабре.
#МетодыObject
#Многопоточность
Часто этот вопрос формулируется как задача Producer-сonsumer. Эту задачу и практические задачи на многопоточность вообще при возможности лучше реализовывать на высокоуровневых примитивах синхронизации. Другой подход – воспользоваться также низкоуровневой, но оптимистической блокировкой на compareAndSet. Но обычно использование
notify
/wait
(пессимистическая блокировка) – условие этого задания, то есть требуется реализовать уже существую BlockingQueue.Эти методы вместе с
synchronized
– самый низкий уровень пессимистических блокировок в Java, использующийся внутри реализации примитивов синхронизации. Еще с Java 5 в непосредственном использовании этих методов нет необходимости, но теоретические знания всё еще часто спрашивают на интервью.Чтобы вызывать эти методы у объекта, необходимо чтобы был захвачен его монитор (т.е. нужно быть внутри synchronized-блока на этом объекте). В противном случае будет выброшено
IllegalMonitorStateException
. Так что для полного ответа нужно понимать, как работает monitor lock (блок synchronized
).Вызов
wait
тормозит текущий поток на ожидание на этом объекте и отпускает его монитор. Исполнение продолжится, когда другой поток вызовет notify
и отпустит блокировку монитора. Если на объекте ожидают несколько потоков, notify
разбудит один случайный, notifyAll
- все сразу.В теории, ожидание wait может быть прервано без вызова
notify
, по желанию JVM (spurious wakeup). На практике это бывает крайне редко, но нужно страховаться и после вызова wait
добавлять дополнительную проверку условия завершения ожидания.Еще два нештатных случая завершения
wait
– прерывание потока извне и таймаут ожидания. В случае прерывания выбрасывается InterruptedException
. Для таймаута нужно указать время ожидания параметрами метода wait
. Значение 0 проигнорируется.Различные проблемы реализации блокировок рассмотрены в Java Concurrency in Practice 14.1.3, 14.2. Для желающих разобраться, как блокировки работают в кишках JVM, написана статья на хабре.
#МетодыObject
#Многопоточность
finalize
Метод придуман для минимизации риска утечки внешних ресурсов. Может быть вызван виртуальной машиной при сборке мусора (добавляя при этом для нее избыточную нагрузку). Это не то же самое, что деструктор в C++.
Есть только гарантии, что метод не будет вызван пока есть ссылки на объект, и что не будет вызван больше одного раза. Даже то, что вызов будет вообще – не факт. Исполнять будет неизвестно какой, но не синхронизированный поток. Исключения проигнорируются.
С давних пор использовать финализаторы не рекомендуется (Effective Java Item 7), а с Java 9 этот метод помечен как deprecated. Вместо финализатора всегда стоит воспользоваться
#МетодыObject
Метод придуман для минимизации риска утечки внешних ресурсов. Может быть вызван виртуальной машиной при сборке мусора (добавляя при этом для нее избыточную нагрузку). Это не то же самое, что деструктор в C++.
Есть только гарантии, что метод не будет вызван пока есть ссылки на объект, и что не будет вызван больше одного раза. Даже то, что вызов будет вообще – не факт. Исполнять будет неизвестно какой, но не синхронизированный поток. Исключения проигнорируются.
С давних пор использовать финализаторы не рекомендуется (Effective Java Item 7), а с Java 9 этот метод помечен как deprecated. Вместо финализатора всегда стоит воспользоваться
try
/finally
, try-with-resource или более специализированными классами пакета java.lang.ref
.#МетодыObject
toString
Строковое представление экземпляра. По умолчанию возвращает
#МетодыObject
#Строки
Строковое представление экземпляра. По умолчанию возвращает
"ПолноеИмяКласса@хэшВ16тиричномВиде"
(например "java.lang.Object@1a23b4f"
). Часть после @
– не адрес в памяти, так что умолчательная реализация почти не несет практической пользы. Полезно добавлять нормальную реализацию даже если не необходимо в логике программы – поможет в отладке. Готовый вызов x.toString()
с проверкой на null
уже реализован в String.valueOf(x)
.#МетодыObject
#Строки