-
Перерахуйте методи класу
Objectequals()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?notifynotifyAllІноді у програмі може бути така ситуація, що нитка увійшла блок коду
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?finalizefinal- Модифікатор- Поля не можуть бути змінені, методи перевизначені
- Класи не можна наслідувати
- Цей модифікатор застосовується тільки до класів, методів та змінних (також і до локальних змінних)
- Аргументи методів, позначені як
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?++iiспочатку збільшується на 1, потім бере участь у виразі .i++спочатку бере участь у виразіi, потім збільшується на 1.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ