logo

Kaip palyginti du objektus Java

Java objektas klasė yra visų Java klasių super klasė. Visos „Java“ klasės pagal numatytuosius nustatymus įgyvendina „Object“ klasę. „Java Object“ klasė suteikia du svarbius metodus palygink du objektai Java , t.y. lygus () ir maišos kodas () metodas. Šiame skyriuje sužinosime, kaip lygus () ir maišos kodas () metodas veikia. Be to, mes taip pat mokysimės kaip palyginti du objektus Java su tinkamais pavyzdžiais.

„Java“ pateikia du objektų klasės metodus, skirtus objektams palyginti:

  • Java equals() metodas
  • Java hashCode() metodas

Java equals() metodas

The lygus () Objektų klasės metodas palyginkite dviejų objektų lygybę. Du objektai bus lygūs, jei jie turės tą patį atminties adresą.

Sintaksė:

 public boolean equals(Object obj) 

Metodas analizuoja atskaitos objektą kaip parametrą. Jis grąžina teisingą, jei objektai yra lygūs, kitu atveju grąžina klaidingą.

Taip pat gali būti, kad objektas yra lygus kitam duotam objektui, tada lygis() metodas seka lygiavertiškumo ryšį palyginti objektus.

    Refleksinis:Jeigu x yra nenuline nuoroda, pašaukimas x.lygu (x) turi grįžti tiesa.Simetriška:Jei dvi nenulines nuorodos yra x ir y, x.lygu (y) grįš tiesa Jeigu, ir tik jeigu y.lygu (x) grąžinti tiesa .Pereinamoji:Jei trys nenulines nuorodos yra x, y , ir z, x.lygu (z) taip pat grįš tiesa jeigu x.equals(y ) ir y.lygu (z) abu grįžta tiesa .Nuoseklus:Jei dvi nenulines nuorodos yra x ir ir , daugkartinis iškvietimas x.lygu(y) nuolat grąžina arba tiesa, arba klaidinga. Jame nepateikiama jokia palyginimui naudota informacija.
  • Bet kokiai nenulinei nuorodai x, x.lygu(null) grąžina klaidingą.

Trumpai tariant, už bet kokią nenulinę nuorodą pasakykite x ir ir , jis grąžina teisingą tada ir tik tada, kai abi nuorodos nurodo tą patį objektą.

Prisiminti: Kai nepaisome lygybės() metodo, būtina nepaisyti hashCode() metodo. Nepaisymas laikomasi metodo hashCode() susitarimo, kuriame teigiama, kad vienodo objekto maišos kodas turi būti vienodas.

jei kitaip jei kitaip jei java

Lygumų() metodo pavyzdys

Toliau pateiktame pavyzdyje mes sukūrėme konstruktoriusDvigubas ir Ilgai klasę ir perduoda atitinkamas reikšmes kaip argumentą, kuris atitinkamai saugomas jų objektuose.

Po to pirmajame println sakinyje iškvietėme equals() metodą ir išanalizuojame objektą y kaip parametrą, kuris lygina objektus x ir y. Tai grįžta klaidinga nes x turi dvigubą reikšmę, o y turi ilgąją reikšmę, kuri nėra lygi.

Panašiai antrajame println sakinyje iškvietėme equals() metodą ir analizuojame tą pačią reikšmę kaip ir Double klasės konstruktoriuje. Tai grįžta tiesa nes dvigubos klasės objektas, ty x, turi tą pačią reikšmę, kurią mes perdavėme lygių () metodu.

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

Išvestis:

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

Skirtumas tarp == Operatoriaus ir lygu() Metodo

Į Java , == operatorius palygina, ar dvi nuorodos yra identiškos, ar ne. Tuo tarpu lygus () metodas lygina du objektus.

Objektai yra lygus kai jie turi tą pačią būseną (dažniausiai lyginant kintamuosius). Objektai yra identiški kai jie dalijasi klasės tapatybe.

Pavyzdžiui, išraiška obj1==obj2 tikrina tapatybę, o ne lygybę. Nors išraiška obj1.equals(obj2) lygina lygybę.

Java hashCode() metodas

Java programoje maišos kodas yra 32 bitų sveikojo skaičiaus reikšmė. Tai unikalus ID pateiktas JVM į Java objektą. Kiekvienas Java objektas yra susietas su maišos kodu. Maišos kodą valdo maišos duomenų struktūra, pvz., HashTable, HashSet ir kt.

Prisiminti: Kai nepaisome lygybės() metodo, taip pat reikia nepaisyti ir hashCode() metodo.

Sintaksė:

sujungti rūšiavimo java
 public int hashCode() 

Jis grąžina atsitiktinai sugeneruotą objekto maišos kodo reikšmę, kuri yra unikali kiekvienam atvejui. Atsitiktinai sugeneruota reikšmė gali pasikeisti kelis kartus vykdant programą.

Bendroji „hashCode“ sutartis yra tokia:

  • Kai jis iškviečiamas daugiau nei vieną kartą vykdant programą, metodas hashCode() nuosekliai grąžins tą patį maišos kodą (sveiko skaičiaus reikšmę). Atminkite, kad objektas neturėtų būti keičiamas.
  • Jei abu objektai yra lygūs pagal equals() metodą, tada iškvietus hashCode() metodą šiuose dviejuose objektuose turi būti gauta ta pati sveikojo skaičiaus reikšmė.
  • Nebūtina, kad jei abu objektai yra nelygūs pagal equals () metodą, tada iškvietus hashCode() metodą šiuose dviejuose objektuose gali būti gauta skirtinga sveikojo skaičiaus reikšmė. Tai reiškia, kad jis gali sukurti tą patį maišos kodą abiem objektams.

HashCode() metodo pavyzdys

Šiame pavyzdyje sukūrėme dvi klases Darbuotojas.java ir HashCodeExample.java .

Darbuotojų klasėje apibrėžėme du laukus regno tipo int ir tipo String pavadinimą. Po to sukūrėme Darbuotojų klasės konstruktorių ir šiuos du laukus perduodame kaip parametrą.

Norėdami atlikti objektų palyginimą, sukūrėme atskirą klasę pavadinimu HashCodePavyzdys . Šioje klasėje sukūrėme du Darbuotojų klasės egzempliorius t.y. emp1 ir emp2 . Po to mes iškvietėme hashCode() metodą naudodami objektus. Mes išsaugojome maišos kodo reikšmę kintamajame a ir b , atitinkamai.

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

Išvestis:

iphone jaustukai android
 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

Nepaisymas lygu() Metodas

Galime nepaisyti lygybės() metodo tokiu būdu, jei norime pateikti savo įgyvendinimą.

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

Aukščiau pateiktas kodo fragmentas rodo, kad du darbuotojai bus lygūs, jei jie bus saugomi tame pačiame atminties adresu arba jie turi tą patį regno. Kai paleidžiame programą (HashCodeExample.java) su aukščiau pateiktu kodo fragmentu, gauname tokią išvestį.

Išvestis:

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