logo

Як порівняти два об’єкти в Java

Об'єкт Java клас є суперкласом серед усіх класів Java. Усі класи Java реалізують клас Object за замовчуванням. Клас Java Object надає два важливі методи для порівняти два об'єкти в Java , тобто дорівнює() і hashCode() метод. У цьому розділі ми дізнаємося, як дорівнює() і hashCode() метод працює. Разом з цим ми також будемо вчитися як порівняти два об'єкти в Java з відповідними прикладами.

Java надає два методи класу Object для порівняння об’єктів:

  • Метод Java equals().
  • Метод Java hashCode().

Метод Java equals().

The дорівнює() метод класу Object порівнює рівність двох об'єктів. Два об’єкти будуть рівними, якщо вони мають однакову адресу пам’яті.

Синтаксис:

 public boolean equals(Object obj) 

Метод аналізує еталонний об’єкт як параметр. Він повертає true, якщо об’єкти рівні, інакше повертає false.

Також можливо, що об’єкт дорівнює іншому даному об’єкту, тоді за ним слідує метод equals(). відношення еквівалентності порівнювати предмети.

спробуйте catch у java
    рефлексивний:Якщо х є ненульовим посиланням, викликом x.equals(x) має повернути істину.Симетричний:Якщо два ненульові посилання є х і y, x.equals(y) повернеться правда якщо і тільки якщо y.equals(x) повернення правда .Перехідний:Якщо три ненульові посилання є x,y , і z, x.equals(z) також повернеться правда якщо x.equals(y ) і y.equals(z) обидва повернення правда .Послідовний:Якщо два ненульові посилання є х і і , багаторазове покликання x.equals(y) постійно повертає або true, або false. Він не надає жодної інформації, яка використовується для порівняння.
  • Для будь-якого ненульового посилання x, x.equals(null) повертає false.

Коротше кажучи, для будь-якого ненульового посилання скажіть х і і , він повертає істину тоді і тільки тоді, коли обидва посилання посилаються на той самий об’єкт.

Пам'ятайте: Коли ми перевизначаємо метод equals(), необхідно перевизначати метод hashCode(). Перевизначення дотримуйтесь конвенції для методу hashCode(), яка стверджує, що рівний об’єкт повинен мати однаковий хеш-код.

Приклад методу equals().

У наступному прикладі ми створили конструктор з Двомісний і Довго клас і передає відповідні значення як аргумент, що зберігається у своїх об’єктах відповідно.

Після цього в першому операторі println ми викликали метод equals() і розібрали об’єкт y як параметр, який порівнює об’єкт x і y. Воно повертається помилковий тому що x містить подвійне значення, а y містить довге значення, яке не дорівнює.

Подібним чином у другому операторі println ми викликали метод equals() і розібрали те саме значення, що й у конструкторі класу Double. Воно повертається правда оскільки об’єкт класу double, тобто x, містить те саме значення, яке ми передали в методі equals().

ObjectComparisonExample.java

 public class ObjectComparisonExample { public static void main(String[] args) { //creating constructor of the Double class Double x = new Double(123.45555); //creating constructor of the Long class Long y = new Long(9887544); //invoking the equals() method System.out.println('Objects are not equal, hence it returns ' + x.equals(y)); System.out.println('Objects are equal, hence it returns ' + x.equals(123.45555)); } } 

Вихід:

 Objects are not equal, hence it returns false Objects are equal, hence it returns true 

Різниця між оператором == і методом equals().

в Java , == оператор порівнює, є два посилання ідентичними чи ні. Тоді як дорівнює() метод порівнює два об'єкти.

Об'єкти є рівні коли вони мають однаковий стан (зазвичай це порівняння змінних). Об'єкти є однакові коли вони поділяють ідентичність класу.

Наприклад, вираз obj1==obj2 перевіряє тотожність, а не рівність. Поки вираз obj1.equals(obj2) порівнює рівність.

Метод Java hashCode().

У Java хеш-код — це 32-розрядне ціле число зі знаком. Це унікальний ідентифікатор, наданий JVM до об’єкта Java. Кожен об'єкт Java пов'язаний з хеш-кодом. Хеш-кодом керує структура даних на основі хешів, наприклад HashTable, HashSet тощо.

Пам'ятайте: Коли ми перевизначаємо метод equals(), необхідно також перевизначати метод hashCode().

Синтаксис:

 public int hashCode() 

Він повертає випадково згенероване значення хеш-коду об’єкта, унікальне для кожного екземпляра. Випадково згенероване значення може змінюватися протягом кількох виконання програми.

Загальний договір для hashCode:

  • Якщо під час виконання програми метод hashCode() викликається кілька разів, він постійно повертатиме той самий хеш-код (ціле число). Зауважте, що об’єкт не слід змінювати.
  • Якщо два об’єкти рівні відповідно до методу equals(), то виклик методу hashCode() для цих двох об’єктів повинен давати однакове ціле значення.
  • Зовсім необов’язково, що якщо два об’єкти є нерівними відповідно до методу equals(), то виклик методу hashCode() для цих двох об’єктів може створити різне ціле значення. Це означає, що він може створити однаковий хеш-код для обох об’єктів.

Приклад методу hashCode().

У наступному прикладі ми створили два класи Employee.java і HashCodeExample.java .

У класі Employee ми визначили два поля regno типу int і name типу String. Після цього ми створили конструктор класу Employee і передаємо ці два поля як параметр.

Для порівняння об’єктів ми створили окремий клас під назвою HashCodeExample . У цьому класі ми створили два екземпляри класу Employee, тобто emp1 і emp2 . Після цього ми викликали метод hashCode() за допомогою об’єктів. Ми зберегли значення хеш-коду в змінній a і b , відповідно.

Employee.java

 public class Employee { private int regno; private String name; //constructor of Employee class public Employee(int regno, String name) { this.name = name; this.regno = regno; } public int getRegno() { return regno; } public void setRegno(int Regno) { this.regno = regno; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

HashCodeExample.java

 public class HashcodeExample { public static void main(String[] args) { //creating two instances of the Employee class Employee emp1 = new Employee(918, 'Maria'); Employee emp2 = new Employee(918, 'Maria'); //invoking hashCode() method int a=emp1.hashCode(); int b=emp2.hashCode(); System.out.println('hashcode of emp1 = ' + a); System.out.println('hashcode of emp2 = ' + b); System.out.println('Comparing objects emp1 and emp2 = ' + emp1.equals(emp2)); } } 

Вихід:

 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

Перевизначення методу equals().

Ми можемо перевизначити метод equals() у такий спосіб, якщо хочемо забезпечити власну реалізацію.

 //overriding equals() method @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; return this.getRegno() == ((Employee) obj). getRegno(); } 

Наведений вище фрагмент коду показує, що два співробітники будуть рівними, якщо вони зберігаються в одній адресі пам’яті або мають однакове regno. Коли ми запускаємо програму (HashCodeExample.java) із наведеним вище фрагментом коду, ми отримуємо наступний результат.

Вихід:

 hashcode of emp1 = 2032578917 hashcode of emp2 = 1531485190 Comparing objects emp1 and emp2 = true