logo

Jak porovnat dva objekty v Javě

Objekt Java class je super třída všech tříd Java. Všechny třídy Java standardně implementují třídu Object. Třída Java Object poskytuje dvě důležité metody porovnat dva objekty v Javě , tj. rovná se() a hashCode() metoda. V této části se naučíme jak rovná se() a hashCode() metoda funguje. Spolu s tím se také naučíme jak porovnat dva objekty v Javě se správnými příklady.

Java poskytuje dvě metody třídy Object pro porovnání objektů:

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

Metoda Java equals().

The rovná se() metoda třídy Object porovná rovnost dvou objektů. Tyto dva objekty budou stejné, pokud budou sdílet stejnou adresu paměti.

stáhněte si video z youtube pomocí vlc

Syntax:

 public boolean equals(Object obj) 

Metoda analyzuje referenční objekt jako parametr. Pokud jsou objekty stejné, vrátí hodnotu true, jinak vrátí hodnotu false.

Je také možné, že se objekt rovná jinému danému objektu, pak následuje metoda equals(). vztah ekvivalence porovnat předměty.

    Reflexní:Li X je nenulová reference, volání x.rovná se(x) musí vrátit true.Symetrický:Pokud jsou dva nenulové odkazy X a y, x.rovná se(y) vrátí se skutečný tehdy a jen tehdy y.rovná se(x) vrátit se skutečný .Tranzitivní:Pokud jsou tři nenulové odkazy x, y , a z, x.rovná se(z) se také vrátí skutečný -li x.rovná se(y ) a y.rovná se(z) oba se vrací skutečný .Konzistentní:Pokud jsou dva nenulové odkazy X a a , vícenásobné volání x.rovná se(y) neustále vrací buď true nebo false. Neposkytuje žádné informace použité při srovnání.
  • Pro jakýkoli nenulový odkaz x, x.se rovná (null) vrací false.

Stručně řečeno, pro jakýkoli nenulový odkaz řekněme X a a , vrátí hodnotu true tehdy a pouze tehdy, když oba odkazy odkazují na stejný objekt.

Pamatovat si: Když přepíšeme metodu equals(), je nutné přepsat metodu hashCode(). Přepsání se řídí konvencí pro metodu hashCode(), která říká, že stejný objekt musí mít stejný hash kód.

Příklad metody equals().

V následujícím příkladu jsme vytvořili konstruktér z Dvojnásobek a Dlouho třídy a předává odpovídající hodnoty, jako argument, který ukládá do svých objektů, resp.

Poté jsme v prvním příkazu println vyvolali metodu equals() a analyzovali objekt y jako parametr, který porovnává objekt x a y. Vrací se Nepravdivé protože x má hodnotu double a y má hodnotu long, která se nerovná.

Podobně jsme ve druhém příkazu println vyvolali metodu equals() a analyzovali stejnou hodnotu jako v konstruktoru třídy Double . Vrací se skutečný protože objekt dvojité třídy, tj. x, má stejnou hodnotu, jakou jsme předali v metodě 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)); } } 

Výstup:

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

Rozdíl mezi operátorem == a metodou equals().

v Jáva , == operátor porovná, zda jsou dva odkazy totožné nebo ne. Vzhledem k tomu, rovná se() metoda porovnává dva objekty.

Objekty jsou rovnat se když mají stejný stav (obvykle porovnání proměnných). Objekty jsou identické když sdílejí třídní identitu.

Například výraz obj1==obj2 testuje identitu, ne rovnost. Zatímco výraz obj1.rovná se(obj2) srovnává rovnost.

Metoda Java hashCode().

V Javě je hash kód 32bitová celočíselná hodnota se znaménkem. Jedná se o jedinečné ID poskytnuté společností JVM na objekt Java. Každý objekt Java je spojen s hash kódem. Hash kód je spravován datovou strukturou založenou na hash, jako je HashTable, HashSet atd.

Pamatovat si: Když přepíšeme metodu equals(), je nutné přepsat také metodu hashCode().

Syntax:

vypsat řetězec java
 public int hashCode() 

Vrací náhodně vygenerovanou hodnotu hash kódu objektu, která je jedinečná pro každou instanci. Náhodně generovaná hodnota se může během několika spuštění programu změnit.

Obecná smlouva pro hashCode je:

  • Pokud je během provádění aplikace vyvolána více než jednou, metoda hashCode() bude konzistentně vracet stejný hash kód (celočíselnou hodnotu). Všimněte si, že objekt by neměl být měněn.
  • Pokud jsou dva objekty stejné podle metody equals(), pak vyvolání metody hashCode() na těchto dvou objektech musí vytvořit stejnou celočíselnou hodnotu.
  • Není nutné, aby v případě, že si dva objekty nejsou rovné podle metody equals(), pak vyvoláním metody hashCode() na těchto dvou objektech může vzniknout odlišná celočíselná hodnota. To znamená, že může vytvořit stejný hash kód pro oba objekty.

Příklad metody hashCode().

V následujícím příkladu jsme vytvořili dvě třídy Employee.java a HashCodeExample.java .

řetězec.formát

Ve třídě Zaměstnanec jsme definovali dvě pole regno typu int a jméno typu String. Poté jsme vytvořili konstruktor třídy Employee a předáme tato dvě pole jako parametr.

Pro porovnání objektů jsme vytvořili samostatnou třídu s názvem Příklad hashCode . V této třídě jsme vytvořili dvě instance třídy Zaměstnanec, tj. emp1 a emp2 . Poté jsme pomocí objektů vyvolali metodu hashCode(). Do proměnné jsme uložili hodnotu hash kódu A a b , resp.

Employee.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ýstup:

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

Přepsání metody equals().

Pokud chceme poskytnout vlastní implementaci, můžeme metodu equals() přepsat následujícím způsobem.

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

Výše uvedený fragment kódu ukazuje, že dva zaměstnanci si budou rovni, pokud jsou uloženi na stejné adrese paměti nebo mají stejné regno. Když spustíme program (HashCodeExample.java) s výše uvedeným fragmentem kódu, dostaneme následující výstup.

Výstup:

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