Java обект клас е супер класът от всички класове на Java. Всички Java класове имплементират класа Object по подразбиране. Класът Java Object предоставя двата важни метода за сравнете две обекти в Java , i.e. равно на() и хеш код() метод. В този раздел ще научим как равно на() и хеш код() методът работи. Заедно с това ние също ще научим как да сравните два обекта в Java с подходящи примери.
Java предоставя двата метода на класа Object за сравняване на обектите, както следва:
- Метод Java equals().
- Метод на Java hashCode().
Метод Java equals().
The равно на() метод на класа Object сравнява равенството на два обекта. Двата обекта ще бъдат равни, ако споделят един и същ адрес на паметта.
Синтаксис:
public boolean equals(Object obj)
Методът анализира референтен обект като параметър. Връща true, ако обектите са равни, в противен случай връща false.
Възможно е също един обект да е равен на друг даден обект, тогава методът equals() следва отношение на еквивалентност за сравняване на обектите.
факторен java
- За всяка ненулева препратка x, x.equals(null) връща невярно.
Накратко, за всяка ненулева препратка кажете х и и , той връща true, ако и само ако и двете препратки се отнасят за един и същ обект.
Помня: Когато заменим метода equals(), е необходимо да заменим метода hashCode(). Замяната следва конвенцията за метода hashCode(), който гласи, че равният обект трябва да има еднакъв хеш код.
Пример за метод equals().
В следващия пример създадохме конструктор от Двойна и Дълги клас и предава съответните стойности, като аргумент, който се съхранява в техните обекти, съответно.
След това в първия оператор println извикахме метода equals() и анализираме обект y като параметър, който сравнява обекта x и y. Връща се невярно защото x съдържа двойната стойност, а y съдържа дългата стойност, която не е равна.
По подобен начин във втория оператор println извикахме метода equals() и анализирахме същата стойност като в конструктора на класа 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().
В следващия пример създадохме два класа Служител.java и HashCodeExample.java .
В класа Employee сме дефинирали две полета regno от тип int и name от тип String. След това създадохме конструктор на класа Employee и предаваме тези две полета като параметър.
За да извършим сравнението на обекти, създадохме отделен клас с име HashCodeExample . В този клас създадохме два екземпляра на класа Employee, т.е. emp1 и emp2 . След това извикахме метода hashCode(), използвайки обекти. Ние сме съхранили стойността на хеш кода в променливата а и b , съответно.
Служител.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