-
Перерахуйте методи класу
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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ