logo

Hvordan sammenligne to objekter i Java

Java-objekt klasse er superklassen for alle Java-klassene. Alle Java-klasser implementerer Object-klassen som standard. Java Object-klassen gir de to viktige metodene for å sammenligne to objekter i Java , dvs. er lik() og hashkode() metode. I denne delen lærer vi hvordan er lik() og hashkode() metoden fungerer. Sammen med dette vil vi også lære hvordan sammenligne to objekter i Java med riktige eksempler.

Java gir de to metodene i Object-klassen for å sammenligne objektene er som følger:

  • Java equals() metode
  • Java hashCode() Metode

Java equals() metode

De er lik() metoden til objektklassen sammenligne likheten mellom to objekter. De to objektene vil være like hvis de deler samme minneadresse.

Syntaks:

 public boolean equals(Object obj) 

Metoden analyserer et referanseobjekt som en parameter. Den returnerer sann hvis objektene er like, ellers returnerer den falsk.

Det er også mulig at et objekt er lik et annet gitt objekt, da følger equals()-metoden ekvivalensforhold å sammenligne objektene.

    Refleksiv:Hvis x er en ikke-nullreferanse, kallet til x.lik(x) må returnere sant.Symmetrisk:Hvis de to ikke-nullreferansene er x og y, x.lik(y) vil returnere ekte hvis og bare hvis y.lik(x) komme tilbake ekte .Transitiv:Hvis de tre ikke-nullreferansene er x, y , og z, x.lik(z) kommer også tilbake ekte hvis x.lik(y ) og y.equals(z) begge returnerer ekte .Konsistent:Hvis de to ikke-nullreferansene er x og og , den multiple calling av x.lik(y) returnerer konstant enten sant eller usant. Den gir ingen informasjon brukt i sammenligningen.
  • For enhver referanse som ikke er null x, x.equals(null) returnerer usant.

Kort sagt, for enhver ikke-null referanse si x og og , returnerer den sann hvis og bare hvis begge referansene refererer til samme objekt.

Huske: Når vi overstyrer equals()-metoden, er det nødvendig å overstyre hashCode()-metoden. Overstyring følger konvensjonen for hashCode()-metoden som sier at det like objektet må ha lik hashkode.

Eksempel på equals()-metoden

I følgende eksempel har vi laget konstruktør av Dobbelt og Lang klasse og sender tilsvarende verdier, som et argument som er lagret i objektene deres.

Etter det, i den første println-setningen, har vi påkalt metoden equals() og analyserer et objekt y som en parameter som sammenligner objektet x og y. Den kommer tilbake falsk fordi x holder den doble verdien og y holder den lange verdien som ikke er lik.

På samme måte har vi i den andre println-setningen påkalt metoden equals() og analysert den samme verdien som i konstruktøren til Double-klassen . Den kommer tilbake ekte fordi objektet av dobbel klasse, dvs. x har samme verdi som vi har passert i equals()-metoden.

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

Produksjon:

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

Forskjellen mellom == Operator og equals() metode

I Java , den == operatør sammenligner om to referanser er identiske eller ikke. Mens er lik() metoden sammenligner to objekter.

Objekter er lik når de har samme tilstand (vanligvis sammenligner variabler). Objekter er identisk når de deler klasseidentiteten.

For eksempel uttrykket obj1==obj2 tester identiteten, ikke likhet. Mens uttrykket obj1.equals(obj2) sammenligner likestilling.

java cast streng til int

Java hashCode() Metode

I Java er hash-kode en 32-bits signert heltallsverdi. Det er en unik id levert av JVM til Java-objekt. Hvert Java-objekt er knyttet til hash-koden. Hash-koden administreres av en hash-basert datastruktur, slik som HashTable, HashSet, etc.

Huske: Når vi overstyrer equals()-metoden, er det nødvendig å overstyre hashCode()-metoden også.

Syntaks:

 public int hashCode() 

Den returnerer en tilfeldig generert hashkodeverdi for objektet som er unik for hver forekomst. Den tilfeldig genererte verdien kan endres under flere kjøringer av programmet.

Den generelle kontrakten for hashCode er:

  • Når den påkalles mer enn én gang under kjøringen av en applikasjon, vil hashCode()-metoden konsekvent returnere den samme hashkoden (heltallsverdi). Merk at objektet ikke skal endres.
  • Hvis de to objektene er like i henhold til equals()-metoden, må påkalling av hashCode()-metoden på disse to objektene produsere samme heltallsverdi.
  • Det er ikke nødvendig at hvis de to objektene er ulik i henhold til equals()-metoden, kan det å påkalle hashCode()-metoden på disse to objektene produsere distinkt heltallsverdi. Det betyr at den kan produsere samme hash-kode for begge objektene.

Eksempel på hashCode()-metoden

I følgende eksempel har vi laget to klasser Employee.java og HashCodeExample.java .

I Employee-klassen har vi definert to felt regno av typen int og navn på typen String. Etter det har vi laget en konstruktør av klassen Employee og sender disse to feltene som en parameter.

For å utføre sammenligningen av objekter har vi laget en egen klasse kalt HashCodeExample . I denne klassen har vi laget to forekomster av Employee-klassen, dvs. emp1 og emp2 . Etter det har vi påkalt hashCode()-metoden ved å bruke objekter. Vi har lagret hash-kodeverdien i variabelen en og b , henholdsvis.

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

Produksjon:

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

Overstyre equals()-metoden

Vi kan overstyre equals()-metoden på følgende måte hvis vi ønsker å gi egen implementering.

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

Kodebiten ovenfor viser at to ansatte vil være like dersom de er lagret i samme minneadresse eller de har samme regno. Når vi kjører programmet (HashCodeExample.java) med kodebiten ovenfor, får vi følgende utgang.

Produksjon:

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