logo

Hogyan hasonlítsunk össze két objektumot Java-ban

Java objektum osztály az összes Java osztály szuperosztálya. Minden Java osztály alapértelmezés szerint az Object osztályt valósítja meg. A Java Object osztály biztosítja a két fontos módszert összehasonlítani kettőt objektumok Java nyelven , azaz egyenlő () és hash kód() módszer. Ebben a részben megtudjuk, hogyan egyenlő () és hash kód() módszer működik. Ezzel együtt tanulni is fogunk hogyan lehet összehasonlítani két objektumot Java-ban megfelelő példákkal.

A Java az Object osztály két metódusát biztosítja az objektumok összehasonlításához:

verem java-ban
  • Java equals() Method
  • Java hashCode() metódus

Java equals() Method

A egyenlő () Az Object osztály metódusa hasonlítsa össze két objektum egyenlőségét. A két objektum akkor lesz egyenlő, ha ugyanazon a memóriacímen osztoznak.

Szintaxis:

 public boolean equals(Object obj) 

A metódus egy referenciaobjektumot elemzi paraméterként. Igazat ad vissza, ha az objektumok egyenlőek, egyébként hamis értéket ad vissza.

Az is előfordulhat, hogy egy objektum egyenlő egy másik adott objektummal, ekkor az equals() metódus követi a ekvivalencia reláció összehasonlítani a tárgyakat.

    Visszaható:Ha x egy nem nulla hivatkozás, a hívás x.egyenlő(x) igaznak kell visszatérnie.Szimmetrikus:Ha a két nem nulla hivatkozás az x és y, x.egyenlő(y) vissza fog térni igaz ha, és csak akkor ha y.egyenlő(x) Visszatérés igaz .Tranzitív:Ha a három nem nulla hivatkozás az x, y , és z, x.egyenlő(z) is vissza fog térni igaz ha x.equals(y ) és y.egyenlő(z) mindkettő visszatér igaz .Következetes:Ha a két nem nulla hivatkozás az x és és , a többszörös hívás x.egyenlő(y) állandóan igaz vagy hamis értéket ad vissza. Nem ad semmilyen, az összehasonlítás során felhasznált információt.
  • Bármilyen nem nulla hivatkozáshoz x, x.egyenlő(null) hamis értéket ad vissza.

Röviden, minden nem nulla hivatkozásra mondjuk x és és , akkor és csak akkor ad vissza igazat, ha mindkét hivatkozás ugyanarra az objektumra vonatkozik.

Emlékezik: Amikor felülírjuk az equals() metódust, akkor felül kell írni a hashCode() metódust. A felülbírálás követi a hashCode() metódusra vonatkozó konvenciót, amely szerint az egyenlő objektumnak azonos hash kóddal kell rendelkeznie.

Példa az equals() metódusra

A következő példában létrehoztuk konstruktőr a Kettős és Hosszú osztályt, és a megfelelő értékeket adja át az objektumaikban tárolt argumentumként.

Ezt követően az első println utasításban meghívtuk az equals() metódust, és egy y objektumot elemeztünk paraméterként, amely összehasonlítja az x és y objektumot. Visszatér hamis mert x tartalmazza a dupla értéket és y a hosszú értéket, amely nem egyenlő.

Hasonlóképpen, a második println utasításban meghívtuk az equals() metódust, és ugyanazt az értéket elemeztük, mint a Double osztály konstruktorában. Visszatér igaz mert a dupla osztály objektuma, azaz az x ugyanazt az értéket tartalmazza, mint amit az equals() metódusban átadtunk.

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

Kimenet:

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

Különbség az == operátor és az equals() metódus között

Ban ben Jáva , a == operátor összehasonlítja, hogy két hivatkozás azonos-e vagy sem. Míg a egyenlő () módszer két objektumot hasonlít össze.

A tárgyak azok egyenlő amikor azonos állapotúak (általában változók összehasonlítása). A tárgyak azok azonos amikor osztoznak az osztályidentitáson.

Például a kifejezés obj1==obj2 az azonosságot teszteli, nem az egyenlőséget. Míg a kifejezés obj1.egyenlő(obj2) az egyenlőséget hasonlítja össze.

Java hashCode() metódus

A Java nyelvben a hash kód egy 32 bites előjeles egész érték. Ez egy egyedi azonosító, amelyet a JVM Java objektumhoz. Minden Java objektum hozzá van rendelve a hash kódhoz. A hash kódot egy hash alapú adatstruktúra kezeli, például HashTable, HashSet stb.

Emlékezik: Ha felülírjuk az equals() metódust, akkor a hashCode() metódust is felül kell bírálni.

Szintaxis:

 public int hashCode() 

Az objektum véletlenszerűen generált hash-kódját adja vissza, amely minden példányra egyedi. A véletlenszerűen generált érték a program többszöri végrehajtása során változhat.

A hashCode általános szerződése a következő:

  • Ha egy alkalmazás végrehajtása során többször is meghívásra kerül, a hashCode() metódus következetesen ugyanazt a hash kódot (egész értéket) adja vissza. Vegye figyelembe, hogy az objektumot nem szabad módosítani.
  • Ha a két objektum egyenlő az equals() metódus szerint, akkor a hashCode() metódus meghívása ezen a két objektumon ugyanazt az egész értéket kell, hogy adja.
  • Nem szükséges, hogy ha a két objektum az equals() metódus szerint nem egyenlő, akkor a hashCode() metódus meghívása ezen a két objektumon eltérő egész értéket eredményezhet. Ez azt jelenti, hogy mindkét objektumhoz ugyanazt a hash kódot tudja előállítani.

Példa a hashCode() metódusra

A következő példában két osztályt hoztunk létre Munkavállaló.java és HashCodeExample.java .

Az Employee osztályban két regno mezőt definiáltunk int típusú és String típusú névvel. Ezt követően létrehoztuk az Employee osztály konstruktorát, és ezt a két mezőt paraméterként adjuk át.

Az objektumok összehasonlításához külön osztályt hoztunk létre, melynek neve HashCodePélda . Ebben az osztályban az Employee osztály két példányát hoztuk létre, azaz. emp1 és emp2 . Ezt követően objektumok segítségével meghívtuk a hashCode() metódust. A változóban tároltuk a hash kód értékét a és b , ill.

Munkavállaló.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)); } } 

Kimenet:

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

Felülbírálás egyenlő() Metódus

Az equals() metódust a következő módon bírálhatjuk felül, ha saját megvalósítást szeretnénk biztosítani.

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

A fenti kódrészlet azt mutatja, hogy két alkalmazott egyenlő, ha ugyanazon a memóriacímen vannak tárolva, vagy azonos regnóval rendelkeznek. Amikor a programot (HashCodeExample.java) a fenti kódrészlettel futtatjuk, a következő kimenetet kapjuk.

string metódusok java-ban

Kimenet:

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