logo

Cum se compară două obiecte în Java

Obiect Java class este super-clasa tuturor claselor Java. Toate clasele Java implementează în mod implicit clasa Object. Clasa Java Object oferă cele două metode importante pentru compara două obiecte în Java , adică este egal() și hashCode() metodă. În această secțiune, vom afla cum este egal() și hashCode() metoda functioneaza. Odată cu asta vom învăța și noi cum se compară două obiecte în Java cu exemple potrivite.

Java oferă cele două metode ale clasei Object pentru a compara obiectele sunt după cum urmează:

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

Metoda Java equals().

The este egal() metoda clasei Object compară egalitatea a două obiecte. Cele două obiecte vor fi egale dacă au aceeași adresă de memorie.

Sintaxă:

 public boolean equals(Object obj) 

Metoda parsează un obiect de referință ca parametru. Returnează adevărat dacă obiectele sunt egale, altfel returnează false.

java factorial

De asemenea, este posibil ca un obiect să fie egal cu un alt obiect dat, apoi metoda equals() urmează relație de echivalență pentru a compara obiectele.

    Reflexiv:Dacă X este o referință non-nulă, apelarea x.egal (x) trebuie să revină adevărat.Simetric:Dacă cele două referințe non-nule sunt X și y, x.egal (y) va reveni Adevărat dacă și numai dacă y.egal (x) întoarcere Adevărat .Tranzitiv:Dacă cele trei referințe non-nule sunt X y , și z, x.egal (z) se va întoarce și el Adevărat dacă x.egal (y ) și y.egal(z) ambele retururi Adevărat .Consistent:Dacă cele două referințe non-nule sunt X și și , apelarea multiplă a x.egal (y) returnează în mod constant fie adevărat, fie fals. Nu furnizează nicio informație utilizată în comparație.
  • Pentru orice referință non-nulă x, x.egal (null) returnează false.

Pe scurt, pentru orice referință non-nulă să spunem X și și , returnează adevărat dacă și numai dacă ambele referințe se referă la același obiect.

Tine minte: Când suprascriem metoda equals(), este necesar să suprascriem metoda hashCode(). Suprascrierea urmează convenția pentru metoda hashCode() care afirmă că obiectul egal trebuie să aibă cod hash egal.

Exemplu de metodă equals().

În exemplul următor, am creat constructor al Dubla și Lung clasa si trece valorile corespunzatoare, ca un argument care, respectiv, stocate in obiectele lor.

După aceea, în prima instrucțiune println, am invocat metoda equals() și am analizat un obiect y ca parametru care compară obiectul x și y. Se întoarce fals deoarece x deține valoarea dublă și y deține valoarea lungă care nu este egală.

În mod similar, în a doua instrucțiune println, am invocat metoda equals() și am analizat aceeași valoare ca în constructorul clasei Double. Se întoarce Adevărat deoarece obiectul clasei duble, adică x deține aceeași valoare pe care am transmis-o în metoda equals().

java main

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

Ieșire:

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

Diferența dintre == Operator și metoda equals().

În Java , cel == operatorul compară faptul că două referințe sunt identice sau nu. Întrucât este egal() metoda compară două obiecte.

Obiectele sunt egal când au aceeași stare (de obicei comparând variabile). Obiectele sunt identic când împărtășesc identitatea de clasă.

De exemplu, expresia obj1==obj2 testează identitatea, nu egalitatea. În timp ce expresia obj1.equals(obj2) compară egalitatea.

adder plin adder

Metoda Java hashCode().

În Java, codul hash este o valoare întreagă semnată de 32 de biți. Este un ID unic furnizat de JVM la obiectul Java. Fiecare obiect Java este asociat cu codul hash. Codul hash este gestionat de o structură de date bazată pe hash, cum ar fi HashTable, HashSet etc.

Tine minte: Când suprascriem metoda equals(), este necesar să suprascriem și metoda hashCode().

Sintaxă:

 public int hashCode() 

Returnează o valoare de cod hash generată aleatoriu a obiectului, care este unică pentru fiecare instanță. Valoarea generată aleatoriu se poate modifica în timpul mai multor execuții ale programului.

Contractul general pentru hashCode este:

  • Când este invocată de mai multe ori în timpul execuției unei aplicații, metoda hashCode() va returna în mod constant același cod hash (valoare întreagă). Rețineți că obiectul nu trebuie modificat.
  • Dacă cele două obiecte sunt egale conform metodei equals(), atunci invocarea metodei hashCode() pe aceste două obiecte trebuie să producă aceeași valoare întreagă.
  • Nu este necesar ca, dacă cele două obiecte sunt inegale conform metodei equals(), atunci invocarea metodei hashCode() pe aceste două obiecte poate produce o valoare întreagă distinctă. Înseamnă că poate produce același cod hash pentru ambele obiecte.

Exemplu de metodă hashCode().

În exemplul următor, am creat două clase Angajat.java și HashCodeExample.java .

În clasa Employee, am definit două câmpuri regno de tip int și nume de tip String. După aceea, am creat un constructor al clasei Employee și trecem aceste două câmpuri ca parametru.

Pentru a efectua compararea obiectelor, am creat o clasă separată numită HashCodeExample . În această clasă, am creat două instanțe ale clasei Employee, i.e. emp1 și emp2 . După aceea, am invocat metoda hashCode() folosind obiecte. Am stocat valoarea codului hash în variabilă A și b , respectiv.

conversia int în java dublu

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

Ieșire:

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

Suprascrierea equals() Metoda

Putem suprascrie metoda equals() în felul următor dacă dorim să oferim o implementare proprie.

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

Fragmentul de cod de mai sus arată că doi angajați vor fi egali dacă sunt stocați în aceeași adresă de memorie sau au același regno. Când rulăm programul (HashCodeExample.java) cu fragmentul de cod de mai sus, obținem următoarea ieșire.

Ieșire:

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