Методи hashCode() та equals() 2


  • hashCode() та equals() – публічні методи, які наслідуються від батьківського класу
  • Операція == використовується для того, аби визначити чи обидва її операнди (змінні) посилаються на один і той самий об’єкт у пам’яті.
  • Метод equals() використовується для порівняння якщо потрібно визначити чи два різні об’єкти є ідентичними за суттю (звісно, що для двох посилань на той самий об’єкт equals() поверне значення true).
  • Якщо не перевизначати метод equals(), то ідентичними вважатимуться тільки посилання на один і той же об’єкт. Така поведінка на дозволяє використовувати об’єкт, скажімо, у якості ключа хешмапи.
  • У класі String і класах-обгортках метод equals() перевизначено, тому їх зручно застосовувати як ключі.
  • Якщо ви пере визначаєте метод equals(), то у ньому першим ділом слід скористатися оператором instanceOf щоб уникнути ситуації коли ви намагаєтеся порівнювати об’єкти різних типів (класів).
  • Втім, у деяких випадках може бути потрібно щоб об’єкти різних класів мали можливість взаємного порівняння J
  • При перевизначенні equals() для порівняння можуть використовуватися всі або ж тільки певні поля об’єкту.
  • Для правильно перевизначеного методу equals() справджуються наступні умови:
    • equals(x) рівне true;
    • Якщо equals(y) рівне true то і y.equals(x) рівне true (властивість симетрії);
    • Якщо equals(y) рівне true і y.equals(z) рівне true то і x.equals(z) дорівнює true (властивість транзитивності);
    • Кожен виклик методу .equals() для тих самих аргументів повертає однакове значення;
    • x.equals(null) рівне false у всіх випадках крім випадку коли x дорівнює null;
  • Для рівних за .equals() об’єктів збігається hashCode(), але об’єкти з однаковим hashCode() не обов’язково рівні за equals().
  • У зв’язку з попереднім правилом, при перевизначенні методу equals() необхідно також перевизначити і hashCode().
  • Хешування використовується у колекціях, що мають у назві частинку ‘Hash’: HashMap, LinkedHashSet, Hashtable, тощо. Якщо ви плануєте зберігати об’єкт у одній із таких колекцій, то йому необхідно перевизначити метод hashCode().
  • В принципі дозволяється щоб всі об’єкти мали однаковий хешкод, але для ефективного пошуку об’єктів у колекції необхідно перевизначити hashCode() так, щоб об’єкти рівномірно розподілялися по бакетах колекції.
  • Для правильно перевизначеного методу hashCode() справджуються наступні умови:
    • Кожен виклик методу . hashCode () для тих самих аргументів повертає однакове значення;
    • Якщо x.equals(y) рівне true, то і x.hashCode() рівне y.hashCode();
    • Якщо x.equals(y) рівне false, то і x.hashCode() та y.hashCode() можуть бути як рівними так і різними;
    • Змінні (поля), позначені як transient, не можна використовувати для hashCode() та equals(), оскільки ці методи повинні повертати незмінні значення для об’єкту навіть після того, як його було серіалізовано та десеріалізовано.

Почитайте ще оце:


Залиште коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

2 thoughts on “Методи hashCode() та equals()