logo

Ako porovnať dva objekty v Jave

Java Object trieda je super trieda všetkých tried Java. Všetky triedy Java štandardne implementujú triedu Object. Trieda Java Object poskytuje dve dôležité metódy porovnaj dva objekty v Jave , t.j. rovná sa() a hashCode() metóda. V tejto časti sa naučíme ako rovná sa() a hashCode() metóda funguje. Spolu s tým sa budeme aj učiť ako porovnať dva objekty v Jave so správnymi príkladmi.

Java poskytuje dve metódy triedy Object na porovnanie objektov:

tostring v jazyku java
  • Metóda Java sa rovná().
  • Java hashCode() metóda

Metóda Java sa rovná().

The rovná sa() metóda triedy Object porovnať rovnosť dvoch objektov. Tieto dva objekty budú rovnaké, ak budú zdieľať rovnakú pamäťovú adresu.

Syntax:

 public boolean equals(Object obj) 

Metóda analyzuje referenčný objekt ako parameter. Ak sú objekty rovnaké, vráti hodnotu true, inak vráti hodnotu false.

Je tiež možné, že objekt sa rovná inému danému objektu, potom nasleduje metóda equals(). vzťah ekvivalencie na porovnanie predmetov.

    Reflexívne:Ak X je nenulový odkaz, volanie x.rovná sa(x) musí vrátiť true.Symetrické:Ak sú dva nenulové odkazy X a y, x.rovná sa(y) vráti sa pravda ak a len vtedy y.rovná sa(x) vrátiť pravda .Prechodné:Ak sú tri nenulové odkazy x, y a z, x.rovná sa(z) sa tiež vráti pravda ak x.rovná sa(y ) a y.rovná sa(z) oba sa vracajú pravda .konzistentné:Ak sú dva nenulové odkazy X a a , viacnásobné volanie x.rovná sa(y) neustále vracia buď true alebo false. Neposkytuje žiadne informácie použité pri porovnaní.
  • Pre akýkoľvek nenulový odkaz x, x.sa rovná (null) vráti false.

Stručne povedané, pre akýkoľvek nenulový odkaz povedzte X a a , vráti hodnotu true vtedy a len vtedy, ak oba odkazy odkazujú na rovnaký objekt.

Pamätajte: Keď prepíšeme metódu equals(), je potrebné prepísať metódu hashCode(). Prepísanie sa riadi konvenciou pre metódu hashCode(), ktorá uvádza, že rovnaký objekt musí mať rovnaký hash kód.

Príklad metódy equals().

V nasledujúcom príklade sme vytvorili konštruktér z Dvojité a Dlhé triede a odovzdáva zodpovedajúce hodnoty, ako argument, ktorý ukladá do svojich objektov, resp.

Potom sme v prvom príkaze println vyvolali metódu equals() a analyzovali objekt y ako parameter, ktorý porovnáva objekt x a y. Vracia sa falošný pretože x má dvojitú hodnotu a y má dlhú hodnotu, ktorá sa nerovná.

Podobne v druhom príkaze println sme vyvolali metódu equals() a analyzovali rovnakú hodnotu ako v konštruktore triedy Double . Vracia sa pravda pretože objekt dvojitej triedy, t. j. x má rovnakú hodnotu, akú sme odovzdali v metóde equals().

matematická trieda java

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

Výkon:

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

Rozdiel medzi operátorom == a metódou equals().

In Java , == operátor porovnáva, či sú dva odkazy identické alebo nie. Zatiaľ čo rovná sa() metóda porovnáva dva objekty.

Objekty sú rovný keď majú rovnaký stav (zvyčajne porovnávajú premenné). Objekty sú identické keď zdieľajú triednu identitu.

Napríklad výraz obj1==obj2 testuje identitu, nie rovnosť. Zatiaľ čo výraz obj1.equals(obj2) porovnáva rovnosť.

Java hashCode() metóda

V jazyku Java je hash kód 32-bitová celočíselná hodnota so znamienkom. Ide o jedinečné ID poskytnuté spoločnosťou JVM na objekt Java. Každý objekt Java je spojený s hash kódom. Hašovací kód je riadený dátovou štruktúrou založenou na hašovaní, ako je HashTable, HashSet atď.

Pamätajte: Keď prepíšeme metódu equals(), je potrebné prepísať aj metódu hashCode().

Syntax:

 public int hashCode() 

Vracia náhodne vygenerovanú hodnotu hash kódu objektu, ktorá je jedinečná pre každú inštanciu. Náhodne vygenerovaná hodnota sa môže počas niekoľkých spustení programu zmeniť.

Všeobecná zmluva pre hashCode je:

aws červený posun
  • Keď je počas vykonávania aplikácie vyvolaná viac ako raz, metóda hashCode() bude konzistentne vracať rovnaký hash kód (celočíselná hodnota). Upozorňujeme, že objekt by sa nemal meniť.
  • Ak sú dva objekty rovnaké podľa metódy equals(), potom pri vyvolaní metódy hashCode() na týchto dvoch objektoch musí vzniknúť rovnaká celočíselná hodnota.
  • Nie je nutné, že ak sú dva objekty nerovnaké podľa metódy equals(), potom pri vyvolaní metódy hashCode() na týchto dvoch objektoch môže vzniknúť rozdielna celočíselná hodnota. To znamená, že dokáže vytvoriť rovnaký hash kód pre oba objekty.

Príklad metódy hashCode().

V nasledujúcom príklade sme vytvorili dve triedy Zamestnanec.java a HashCodeExample.java .

V triede Zamestnanec sme definovali dve polia regno typu int a meno typu String. Potom sme vytvorili konštruktor triedy Zamestnanec a odovzdali tieto dve polia ako parameter.

Na vykonanie porovnávania objektov sme vytvorili samostatnú triedu s názvom HashCodeExample . V tejto triede sme vytvorili dve inštancie triedy Zamestnanec t.j. emp1 a emp2 . Potom sme pomocou objektov vyvolali metódu hashCode(). Do premennej sme uložili hodnotu hash kódu a a b , resp.

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

Výkon:

java len poľa
 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

Overriding equals() Metóda

Metódu equals() môžeme prepísať nasledujúcim spôsobom, ak chceme poskytnúť vlastnú implementáciu.

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

Vyššie uvedený úryvok kódu ukazuje, že dvaja zamestnanci si budú rovní, ak sú uložení na rovnakej adrese pamäte alebo majú rovnaké regno. Keď spustíme program (HashCodeExample.java) s vyššie uvedeným útržkom kódu, dostaneme nasledujúci výstup.

Výkon:

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