logo

Hur man jämför två objekt i Java

Java-objekt klass är superklassen av alla Java-klasser. Alla Java-klasser implementerar objektklassen som standard. Java Object-klassen tillhandahåller de två viktiga metoderna för att jämför två objekt i Java , dvs. lika() och hash-kod() metod. I det här avsnittet kommer vi att lära oss hur lika() och hash-kod() metoden fungerar. Tillsammans med detta kommer vi också att lära oss hur man jämför två objekt i Java med ordentliga exempel.

Java tillhandahåller de två metoderna i klassen Object för att jämföra objekten enligt följande:

  • Java equals() metod
  • Java hashCode() metod

Java equals() metod

De lika() metod för klassen Object jämföra likheten mellan två objekt. De två objekten kommer att vara lika om de delar samma minnesadress.

Syntax:

 public boolean equals(Object obj) 

Metoden analyserar ett referensobjekt som en parameter. Det returnerar sant om objekten är lika, annars returnerar falskt.

Det är också möjligt att ett objekt är lika med ett annat givet objekt, då följer equals()-metoden ekvivalensförhållande att jämföra objekten.

    Reflexiv:Om x är en icke-nullreferens, anropet av x.equals(x) måste returnera sant.Symmetrisk:Om de två icke-nullreferenserna är x och y, x.lika med(y) kommer att återvända Sann om och endast om y.equals(x) lämna tillbaka Sann .Transitiv:Om de tre icke-nullreferenserna är x, y , och z, x.lika med(z) kommer också tillbaka Sann om x.lika med(y ) och y.equals(z) båda återkommer Sann .Konsekvent:Om de två icke-nullreferenserna är x och och , flera anrop av x.lika med(y) returnerar ständigt antingen sant eller falskt. Den ger ingen information som används i jämförelsen.
  • För alla referenser som inte är noll x, x.equals(null) returnerar falskt.

Kort sagt, för alla icke-nullreferenser säg x och och , returnerar den sant om och endast om båda referenserna refererar till samma objekt.

Kom ihåg: När vi åsidosätter metoden equals() är det nödvändigt att åsidosätta hashCode()-metoden. Åsidosättande följer konventionen för hashCode()-metoden som säger att objektet lika måste ha lika hashkod.

java-formatsträng

Exempel på metoden equals().

I följande exempel har vi skapat konstruktör av Dubbel och Lång klass och skickar motsvarande värden, som ett argument som lagras i respektive objekt.

Efter det, i den första println-satsen, har vi anropat metoden equals() och analyserar ett objekt y som en parameter som jämför objektet x och y. Den återkommer falsk eftersom x håller det dubbla värdet och y håller det långa värdet som inte är lika.

På liknande sätt, i den andra println-satsen, har vi anropat metoden equals() och analyserar samma värde som i konstruktorn för klassen Double. Den återkommer Sann eftersom objektet med dubbelklass dvs x har samma värde som vi har skickat 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 

Skillnaden mellan == Operator och equals() Metod

I Java , den == operatör jämför att två referenser är identiska eller inte. Medan den lika() metod jämför två objekt.

Objekt är likvärdig när de har samma tillstånd (vanligtvis jämföra variabler). Objekt är identisk när de delar klassidentiteten.

Till exempel uttrycket obj1==obj2 prövar identiteten, inte jämlikheten. Medan uttrycket obj1.equals(obj2) jämför jämställdhet.

Java hashCode() metod

I Java är hash-kod ett 32-bitars signerat heltalsvärde. Det är ett unikt ID som tillhandahålls av JVM till Java-objekt. Varje Java-objekt är associerat med hashkoden. Hashkoden hanteras av en hashbaserad datastruktur, såsom HashTable, HashSet, etc.

Kom ihåg: När vi åsidosätter metoden equals() är det nödvändigt att åsidosätta hashCode()-metoden också.

Syntax:

java xor
 public int hashCode() 

Den returnerar ett slumpmässigt genererat hashkodvärde för objektet som är unikt för varje instans. Det slumpmässigt genererade värdet kan ändras under flera körningar av programmet.

Det allmänna avtalet för hashCode är:

  • När den anropas mer än en gång under körningen av en applikation kommer hashCode()-metoden konsekvent att returnera samma hashkod (heltalsvärde). Observera att objektet inte ska ändras.
  • Om de två objekten är lika enligt equals()-metoden måste anropande av hashCode()-metoden på dessa två objekt producera samma heltalsvärde.
  • Det är inte nödvändigt att om de två objekten är ojämlika enligt metoden equals() kan anropande av hashCode()-metoden på dessa två objekt producera distinkt heltalsvärde. Det betyder att den kan producera samma hashkod för båda objekten.

Exempel på hashCode()-metod

I följande exempel har vi skapat två klasser Employee.java och HashCodeExample.java .

I klassen Employee har vi definierat två fält regno av typen int och namnet på typen String. Efter det har vi skapat en konstruktor av klassen Employee och skickar dessa två fält som en parameter.

För att utföra jämförelsen av objekt har vi skapat en separat klass med namnet HashCodeExample . I den här klassen har vi skapat två instanser av klassen Employee, dvs. emp1 och emp2 . Efter det har vi anropat hashCode()-metoden med hjälp av objekt. Vi har lagrat hashkodvärdet i variabeln a och b , respektive.

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:

kan android spela gamepigeon
 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

Åsidosätter metoden equals()

Vi kan åsidosätta equals()-metoden på följande sätt om vi vill tillhandahålla en 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(); } 

Ovanstående kodsnutt visar att två anställda kommer att vara lika om de är lagrade i samma minnesadress eller om de har samma regno. När vi kör programmet (HashCodeExample.java) med ovanstående kodavsnitt får vi följande utdata.

Produktion:

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