logo

Kako usporediti dva objekta u Javi

Java objekt klasa je super klasa svih Java klasa. Sve Java klase prema zadanim postavkama implementiraju klasu Object. Klasa Java Object pruža dvije važne metode za usporedi dva objekti u Javi , tj. jednako() i hashCode() metoda. U ovom odjeljku naučit ćemo kako jednako() i hashCode() metoda radi. Uz to ćemo i učiti kako usporediti dva objekta u Javi s pravilnim primjerima.

Java nudi dvije metode klase Object za usporedbu objekata kako slijedi:

  • Metoda Java equals().
  • Java hashCode() metoda

Metoda Java equals().

The jednako() metodom klase Object usporediti jednakost dvaju objekata. Dva objekta će biti jednaka ako dijele istu memorijsku adresu.

Sintaksa:

 public boolean equals(Object obj) 

Metoda analizira referentni objekt kao parametar. Vraća true ako su objekti jednaki, inače vraća false.

Također je moguće da je objekt jednak drugom danom objektu, tada slijedi metoda equals(). odnos ekvivalencije usporediti objekte.

shloka mehta
    Refleksivno:Ako x je referenca koja nije nula, poziv od x.jednako(x) mora vratiti true.Simetričan:Ako su dvije reference koje nisu nula x i y, x.jednako(y) će se vratiti pravi ako i samo ako y.jednako(x) povratak pravi .tranzitivno:Ako su tri reference koje nisu nula x,y , i z, x.jednako(z) također će se vratiti pravi ako x.jednako(y ) i y.equals(z) oba povratka pravi .Dosljedno:Ako su dvije reference koje nisu nula x i i , višestruko pozivanje x.jednako(y) stalno vraća ili true ili false. Ne pruža nikakve informacije korištene u usporedbi.
  • Za sve reference koje nisu nulte x, x.jednako(nula) vraća false.

Ukratko, za svaku referencu koja nije nula recimo x i i , vraća true ako i samo ako se obje reference odnose na isti objekt.

Zapamtiti: Kada nadjačavamo equals() metodu, potrebno je nadjačati hashCode() metodu. Nadjačavanje slijedi konvenciju za metodu hashCode() koja navodi da isti objekt mora imati jednak hash kod.

Primjer metode equals().

U sljedećem primjeru stvorili smo konstruktor od Dvostruko i dugo klase i prosljeđuje odgovarajuće vrijednosti, kao argument koji se pohranjuje u njihovim objektima, respektivno.

Nakon toga, u prvom println iskazu, pozvali smo equals() metodu i analizirali objekt y kao parametar koji uspoređuje objekte x i y. Vraća se lažno jer x sadrži dvostruku vrijednost, a y dugu vrijednost koja nije jednaka.

Slično tome, u drugoj izjavi println pozvali smo metodu equals() i analizirali istu vrijednost kao u konstruktoru klase Double. Vraća se pravi jer objekt klase double tj. x ima istu vrijednost koju smo proslijedili u metodi equals().

ObjectComparisonExample.java

java petlje
 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)); } } 

Izlaz:

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

Razlika između operatora == i metode equals().

U Java , the == operator uspoređuje jesu li dvije reference identične ili ne. Dok je jednako() metoda uspoređuje dva objekta.

Predmeti su jednak kada imaju isto stanje (obično uspoređujući varijable). Predmeti su identičan kada dijele klasni identitet.

Na primjer, izraz obj1==obj2 ispituje identitet, a ne jednakost. Dok je izraz obj1.jednako(obj2) uspoređuje jednakost.

Java hashCode() metoda

U Javi, hash kod je 32-bitna vrijednost cijelog broja s predznakom. To je jedinstveni ID koji osigurava JVM na Java objekt. Svaki Java objekt povezan je s hash kodom. Hash kodom upravlja struktura podataka koja se temelji na hash-u, kao što su HashTable, HashSet itd.

Zapamtiti: Kada nadjačavamo equals() metodu, potrebno je također nadjačati hashCode() metodu.

Sintaksa:

 public int hashCode() 

Vraća nasumično generiranu vrijednost hash koda objekta koji je jedinstven za svaku instancu. Nasumično generirana vrijednost može se promijeniti tijekom nekoliko izvođenja programa.

java čita datoteku red po red

Opći ugovor za hashCode je:

  • Kada se pozove više puta tijekom izvođenja aplikacije, metoda hashCode() dosljedno će vraćati isti hash kod (cjelobrojna vrijednost). Imajte na umu da se objekt ne smije mijenjati.
  • Ako su dva objekta jednaka prema metodi equals(), tada pozivanje metode hashCode() na ta dva objekta mora proizvesti istu cjelobrojnu vrijednost.
  • Nije nužno da ako su dva objekta nejednaka u skladu s metodom equals(), tada pozivanje metode hashCode() na ta dva objekta može proizvesti različitu cjelobrojnu vrijednost. To znači da može proizvesti isti hash kod za oba objekta.

Primjer metode hashCode().

U sljedećem primjeru kreirali smo dvije klase Zaposlenik.java i HashCodeExample.java .

U klasi Employee definirali smo dva polja regno tipa int i name tipa String. Nakon toga, kreirali smo konstruktor klase Employee i prosljeđujemo ova dva polja kao parametar.

Za usporedbu objekata kreirali smo zasebnu klasu pod nazivom HashCodeExample . U ovoj klasi kreirali smo dvije instance klase Zaposlenik, tj. emp1 i emp2 . Nakon toga smo pozvali metodu hashCode() koristeći objekte. Pohranili smo vrijednost hash koda u varijablu a i b , odnosno.

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

Izlaz:

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

Nadjačavanje metode equals().

Metodu equals() možemo nadjačati na sljedeći način ako želimo osigurati vlastitu implementaciju.

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

Gornji isječak koda pokazuje da će dva zaposlenika biti jednaka ako su pohranjeni na istoj memorijskoj adresi ili imaju isti regno. Kada pokrenemo program (HashCodeExample.java) s gornjim isječkom koda, dobivamo sljedeći izlaz.

Izlaz:

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