logo

Kā salīdzināt divus objektus Java

Java objekts klase ir visu Java klašu superklase. Visas Java klases pēc noklusējuma ievieš objektu klasi. Java Object klase nodrošina divas svarīgas metodes salīdziniet divus objekti Java valodā , t.i. vienāds () un hashCode() metodi. Šajā sadaļā mēs uzzināsim, kā vienāds () un hashCode() metode darbojas. Paralēli tam mēs arī mācīsimies kā salīdzināt divus objektus Java ar pareiziem piemēriem.

instanceof java

Java nodrošina divas objektu klases metodes, lai salīdzinātu objektus:

  • Java ir vienāds () metode
  • Java hashCode() metode

Java ir vienāds () metode

The vienāds () Objektu klases metode salīdzina divu objektu vienādību. Abi objekti būs vienādi, ja tiem ir viena un tā pati atmiņas adrese.

Sintakse:

 public boolean equals(Object obj) 

Metode parsē atsauces objektu kā parametru. Tas atgriež patiesu, ja objekti ir vienādi, pretējā gadījumā atgriež false.

Ir arī iespējams, ka objekts ir vienāds ar citu doto objektu, tad vienāds() metode seko ekvivalences attiecības salīdzināt objektus.

    Refleksīvs:Ja x ir atsauce bez nulles, izsaukums x.vienāds(x) jāatgriežas patiesībai.Simetrisks:Ja divas atsauces, kas nav nulles, ir x un y, x.vienāds(y) atgriezīsies taisnība ja un tikai tad y.vienāds(x) atgriezties taisnība .Transitīvs:Ja trīs ne-null atsauces ir x, y , un z, x.vienāds(z) arī atgriezīsies taisnība ja x.equals(y ) un y.vienāds(z) abi atgriežas taisnība .Konsekventa:Ja divas atsauces, kas nav nulles, ir x un un , daudzkārtējais izsaukums x.vienāds(y) pastāvīgi atgriež patiesu vai nepatiesu. Tas nesniedz nekādu informāciju, kas izmantota salīdzināšanā.
  • Jebkurai atsaucei, kas nav nulles x, x.vienāds(null) atgriež viltus.

Īsāk sakot, par jebkuru ne-null atsauci teikt x un un , tas atgriež patiesu tad un tikai tad, ja abas atsauces attiecas uz vienu un to pašu objektu.

Atcerieties: Kad mēs ignorējam vienāds() metodi, ir nepieciešams ignorēt hashCode() metodi. Ignorējot, ievērojiet hashCode() metodes konvenciju, kas nosaka, ka vienādam objektam ir jābūt vienādam jaucējkodam.

Vienāds() metodes piemērs

Nākamajā piemērā mēs esam izveidojuši konstruktors no Dubults un Gari klasē un nodod atbilstošās vērtības kā argumentu, kas attiecīgi tiek saglabāts to objektos.

Pēc tam pirmajā println priekšrakstā mēs esam izsaukuši equals() metodi un parsējuši objektu y kā parametru, kas salīdzina objektu x un y. Tas atgriežas viltus jo x ir dubultā vērtība un y ir garā vērtība, kas nav vienāda.

Līdzīgi, otrajā println priekšrakstā mēs esam izsaukuši vienāds() metodi un parsējuši to pašu vērtību kā Double klases konstruktorā. Tas atgriežas taisnība jo dubultklases objektam, t.i., x, ir tāda pati vērtība, kādu esam nodevuši vienādības() metodē.

ObjectComparisonExample.java

salīdzināms interfeiss 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)); } } 

Izvade:

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

Atšķirība starp == operatoru un vienāds() metodi

In Java , == operators salīdzina, vai divas atsauces ir identiskas vai nē. Tā kā vienāds () metode salīdzina divus objektus.

Objekti ir vienāds kad tiem ir vienāds stāvoklis (parasti salīdzinot mainīgos). Objekti ir identisks kad viņiem ir kopīga klases identitāte.

Piemēram, izteiksme obj1==obj2 pārbauda identitāti, nevis vienlīdzību. Kamēr izteiksme obj1.equals(obj2) salīdzina vienlīdzību.

Java hashCode() metode

Java valodā jaucējkods ir vesela skaitļa vērtība ar 32 bitu zīmi. Tas ir unikāls ID, ko nodrošina JVM uz Java objektu. Katrs Java objekts ir saistīts ar jaucējkodu. Jaucējkodu pārvalda uz jaucējkodiem balstīta datu struktūra, piemēram, HashTable, HashSet utt.

Atcerieties: Ignorējot vienāds() metodi, ir nepieciešams ignorēt arī hashCode() metodi.

Sintakse:

tādas vietnes kā coomeet
 public int hashCode() 

Tas atgriež nejauši ģenerētu objekta jaucējkoda vērtību, kas ir unikāla katram instancē. Nejauši ģenerētā vērtība var mainīties vairāku programmas izpildes laikā.

Vispārējais līgums par hashCode ir:

  • Ja lietojumprogrammas izpildes laikā tā tiek izsaukta vairāk nekā vienu reizi, metode hashCode() konsekventi atgriezīs to pašu jaucējkodu (vesela skaitļa vērtību). Ņemiet vērā, ka objektu nedrīkst modificēt.
  • Ja abi objekti ir vienādi saskaņā ar vienādu () metodi, tad, izsaucot hashCode() metodi šiem diviem objektiem, ir jāiegūst viena un tā pati vesela skaitļa vērtība.
  • Nav nepieciešams, ka, ja abi objekti ir nevienādi saskaņā ar equals() metodi, tad hashCode() metodes izsaukšana šajos divos objektos var radīt atšķirīgu veselu skaitļu vērtību. Tas nozīmē, ka tas var radīt vienu un to pašu jaucējkodu abiem objektiem.

HashCode() metodes piemērs

Nākamajā piemērā mēs esam izveidojuši divas klases Darbinieks.java un HashCodeExample.java .

Klasē Darbinieks esam definējuši divus laukus regno tipa int un tipa String nosaukumu. Pēc tam esam izveidojuši klases Darbinieks konstruktoru un nododam šos divus laukus kā parametru.

pārvērst int par virkni c++

Lai veiktu objektu salīdzināšanu, esam izveidojuši atsevišķu klasi ar nosaukumu HashCodePiemērs . Šajā klasē esam izveidojuši divus darbinieku klases gadījumus, t.i. emp1 un emp2 . Pēc tam mēs esam izsaukuši hashCode () metodi, izmantojot objektus. Mēs esam saglabājuši jaucējkoda vērtību mainīgajā a un b , attiecīgi.

Darbinieks.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)); } } 

Izvade:

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

Overriding equals() metode

Mēs varam ignorēt vienāds() metodi šādā veidā, ja vēlamies nodrošināt savu ieviešanu.

 //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(); } 

Iepriekš minētais koda fragments parāda, ka divi darbinieki būs vienādi, ja tie tiek glabāti vienā atmiņas adresē vai tiem ir vienāds regno. Palaižot programmu (HashCodeExample.java) ar iepriekš minēto koda fragmentu, mēs iegūstam šādu izvadi.

Izvade:

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