logo

Sådan sammenlignes to objekter i Java

Java objekt klasse er superklassen af ​​alle Java-klasserne. Alle Java-klasser implementerer Object-klassen som standard. Java Object-klassen giver de to vigtige metoder til sammenligne to objekter i Java , dvs. lige med() og hashCode() metode. I dette afsnit lærer vi hvordan lige med() og hashCode() metode virker. Sammen med dette vil vi også lære hvordan man sammenligner to objekter i Java med rigtige eksempler.

Java giver de to metoder i Object-klassen til at sammenligne objekterne er som følger:

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

Java equals() metode

Det lige med() metode i klassen Object sammenligne ligheden mellem to objekter. De to objekter vil være ens, hvis de deler den samme hukommelsesadresse.

Syntaks:

 public boolean equals(Object obj) 

Metoden analyserer et referenceobjekt som en parameter. Det returnerer sandt, hvis objekterne er ens, ellers returnerer falsk.

Det er også muligt, at et objekt er lig med et andet givet objekt, så følger equals()-metoden ækvivalensforhold at sammenligne objekterne.

    Refleksiv:Hvis x er en ikke-nul reference, kaldet af x.lig med(x) skal returnere sandt.Symmetrisk:Hvis de to ikke-nul referencer er x og y, x.lig med(y) kommer tilbage rigtigt hvis og kun hvis y.lig med (x) Vend tilbage rigtigt .Transitiv:Hvis de tre referencer ikke er nul x,y , og z, x.lig med(z) vil også vende tilbage rigtigt hvis x.lig med(y ) og y.lig med(z) begge vender tilbage rigtigt .Konsekvent:Hvis de to ikke-nul referencer er x og og , det multiple kald af x.lig med(y) returnerer konstant enten sandt eller falsk. Det giver ingen oplysninger, der er brugt i sammenligningen.
  • For enhver reference, der ikke er nul x, x.equals(nul) returnerer falsk.

Kort sagt, for enhver ikke-null reference sige x og og , returnerer den sand, hvis og kun hvis begge referencer refererer til det samme objekt.

Husk: Når vi tilsidesætter equals()-metoden, er det nødvendigt at tilsidesætte hashCode()-metoden. Tilsidesættelse følg konventionen for hashCode()-metoden, der siger, at det lige objekt skal have ens hashkode.

Eksempel på equals() metode

I det følgende eksempel har vi lavet konstruktør af Dobbelt og Lang klasse og videregiver tilsvarende værdier, som et argument, der er lagret i deres objekter, hhv.

Derefter har vi i den første println-sætning påkaldt metoden equals() og parser et objekt y som en parameter, der sammenligner objektet x og y. Det vender tilbage falsk fordi x holder den dobbelte værdi og y holder den lange værdi, der ikke er ens.

På samme måde har vi i den anden println-sætning påberåbt sig equals()-metoden og parser den samme værdi som i konstruktøren af ​​Double-klassen. Det vender tilbage rigtigt fordi objektet af dobbelt klasse, dvs. x har samme værdi, som vi har bestået 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)); } } 

Produktion:

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

Forskellen mellem == Operator og equals() metode

I Java , det == operatør sammenligner, om to referencer er identiske eller ej. Hvorimod lige med() metoden sammenligner to objekter.

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

For eksempel udtrykket obj1==obj2 tester identiteten, ikke lighed. Mens udtrykket obj1.equals(obj2) sammenligner ligestilling.

concat strenge java

Java hashCode() metode

I Java er hash-kode en 32-bit signeret heltalsværdi. Det er et unikt id leveret af JVM til Java-objekt. Hvert Java-objekt er knyttet til hash-koden. Hash-koden administreres af en hash-baseret datastruktur, såsom HashTable, HashSet osv.

Husk: Når vi tilsidesætter equals()-metoden, er det også nødvendigt at tilsidesætte hashCode()-metoden.

Syntaks:

 public int hashCode() 

Det returnerer en tilfældigt genereret hash-kodeværdi for objektet, som er unik for hver instans. Den tilfældigt genererede værdi kan ændre sig under flere afviklinger af programmet.

Den generelle kontrakt for hashCode er:

  • Når den påkaldes mere end én gang under udførelsen af ​​en applikation, vil hashCode() metoden konsekvent returnere den samme hashkode (heltalsværdi). Bemærk, at objektet ikke skal ændres.
  • Hvis de to objekter er ens i henhold til equals()-metoden, skal påberåbelse af hashCode()-metoden på disse to objekter producere den samme heltalsværdi.
  • Det er ikke nødvendigt, at hvis de to objekter er ulige ifølge equals()-metoden, så kan en påberåbelse af hashCode()-metoden på disse to objekter producere distinkt heltalsværdi. Det betyder, at det kan producere den samme hash-kode for begge objekter.

Eksempel på hashCode() metode

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

I klassen Employee har vi defineret to felter regno af typen int og navn på typen String. Derefter har vi oprettet en konstruktør af klassen Employee og videregiver disse to felter som en parameter.

For at udføre sammenligningen af ​​objekter har vi oprettet en separat klasse ved navn HashCodeExample . I denne klasse har vi oprettet to forekomster af Employee-klassen, dvs. emp1 og emp2 . Derefter har vi påberåbt hashCode()-metoden ved hjælp af objekter. Vi har gemt hash-kodeværdien i variablen -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)); } } 

Produktion:

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

Tilsidesætte equals()-metoden

Vi kan tilsidesætte equals()-metoden på følgende måde, hvis vi ønsker at levere 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(); } 

Ovenstående kodestykke viser, at to medarbejdere vil være ens, hvis de er gemt i den samme hukommelsesadresse, eller de har samme regno. Når vi kører programmet (HashCodeExample.java) med ovenstående kodestykke, får vi følgende output.

Produktion:

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