Перечислите методы класса
Object
equals()
hashCode()
toString()
getClass()
notify()
notifyAll()
wait()
wait(long timeOut)
wait(long timeOut, int nanos)
Зачем нужны методы
equals
&hashCode
?Используются для сравнения объектов.
Цель метода
equals
– определить идентичны ли объекты внутри, сравнив внутреннее содержание объектов. Такequals
работает медленно, сначала сравниваются хэш коды объектов, и, в том случае, если хэш коды равны, идет проверка поequals
Что будет, если переопределить equals, но не переопределить
hashCode
?Изначально
hashCode
— случайное число.Коллекции в Java перед тем как сравнить объекты с помощью
equals
всегда ищут/сравнивают их с помощью методаhashCode()
. И если у одинаковых объектов будут разныеhashCode
, то объекты будут считаться разными — до сравнения с помощьюequals
просто не дойдет.Зачем нужны методы
wait
,notify
,notifyAll
?Иногда в программе может оказаться такая ситуация, что нить вошла в блок кода
synchronized
, заблокировала монитор и не может работать дальше, т.к. каких-то данных еще не хватает: например, файл который она должна обработать еще не загрузился или что-нибудь в таком духе. Для решения этой проблемы и был придуман методwait()
. Вызов этого метода приводит к тому, что нить освобождает монитор и «становится на паузу».Для снятия с паузы используются методы
notify
,notifyAll
. Методnotify
«размораживает» одну случайную нить, методnotifyAll
– все «замороженные» нити данного монитора.Как правильно клонировать объект?
Два типа клонирования.
Для клонирования объекта по умолчанию нужно:
- Добавить интерфейс
Cloneable
своему классу - Переопределить метод
clone
и вызвать в нем базовую реализацию:
class Point implements Cloneable { int x; int y; public Object clone() { return super.clone(); } }
Или можно написать реализацию метода
clone
самому:class Point { int x; int y; public Object clone() { Point point = new Point(); point.x = this.x; point.y = this.y; return point; } }
- Добавить интерфейс
Зачем нужен метод
finalize()
и как он работает?Если ты помнишь, то
finalize()
– это специальный метод, который вызывается у объекта перед тем, как сборщик мусора его уничтожит.Основная цель этого метода – освободить используемые внешние не-Java ресурсы: закрыть файлы, потоки ввода-вывода и т.п.
finalize()
работает нестабильно.Этот метод не оправдывает возложенных на него надежд. Java-машина может отложить уничтожение объекта, как и вызов метода
finalize
на сколько угодно. Более того, она вообще не гарантирует, что этот метод будет вызван. В куче ситуаций ради «оптимизации» он не вызывается.В чем отличие
final
,finally
,finalize
?final
— модификатор- Поля не могут быть изменены, методы переопределены
- Классы нельзя наследовать
- Этот модификатор применяется только к классам, методам и переменным (также и к локальным переменным)
- Аргументы методов, обозначенные как
final
, предназначены только для чтения, при попытке изменения будет ошибка компиляции - Переменные
final
не инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции - Если final переменная содержит ссылку на объект, объект может быть изменен, но переменная всегда будет ссылаться на тот же самый объект
- Также это справедливо и для массивов, потому что массивы являются объектами, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив
- Если класс объявлен
final
иabstract
(взаимоисключающие понятия), произойдет ошибка компиляции - Так как
final
класс не может наследоваться, его методы никогда не могут быть переопределены
finally
— блок в связкеtry-catch-finally
, код в котором выполнится независимо от того вылетело ли исключение в блокеtry
или нет. Используется для освобождения ресурсов.finalize
— метод в классеObject
см 6.Что такое
try-with-resources
?Это специальная конструкция
try
, называемаяtry-with-resources
, в которой Обрати внимание – послеtry
следуют круглые скобки, где объявляются переменные и создаются объекты. Эти объекты можно использовать внутри блокаtry
, обозначенного скобками{}
. Когда выполнение команд блокаtry
закончится, независимо от того – нормально оно закончилось или было исключение, для объекта, созданного внутри круглых скобок()
, будет вызван методclose()
;Чем отличаются методы
wait(1000)
иsleep(1000)
?sleep()
приостанавливает поток на указанное. состояние меняется на TIMED_WAITING, по истечению — RUNNABLEwait()
меняет состояние потока на WAITINGможет быть вызвано только у объекта владеющего блокировкой, в противном случае выкинется исключение IllegalMonitorStateException. при срабатывании метода блокировка отпускается, что позволяет продолжить работу другим потокам ожидающим захватить ту же самую блокировку . в случае
wait(int)
с аргументом состояние будет TIMED_WAITINGВ чем отличие
i++
и++i
?++i
,i
сначала увеличивается на 1, затем участвует в выражении.i++
,i
сначала участвует в выражении, затем увеличивается на 1.
zor07
31 уровень
Что будет, если переопределить equals, но не переопределить hashCode?
Будет нарушение контракта междуequals()
иhashCode()
, который гласит что: Если два объекта равны друг другу, то естьequals(Object)
возвращаетtrue
, то вызовhashCode()
у каждого из них должен возвращать одинаковые целые числа.