logo

Kuinka vertailla kahta objektia Javassa

Java-objekti class on kaikkien Java-luokkien superluokka. Kaikki Java-luokat toteuttavat oletusarvoisesti Object-luokan. Java Object -luokka tarjoaa kaksi tärkeää menetelmää vertaa kahta objektit Javassa , eli on yhtä suuri () ja hash koodin() menetelmä. Tässä osiossa opimme kuinka on yhtä suuri () ja hash koodin() menetelmä toimii. Tämän ohella opimme myös kuinka vertailla kahta objektia Javassa oikeilla esimerkeillä.

onclick javascript

Java tarjoaa kaksi Object-luokan menetelmää objektien vertailuun:

  • Java equals() -menetelmä
  • Java hashCode() -menetelmä

Java equals() -menetelmä

The on yhtä suuri () Object-luokan menetelmä vertaa kahden objektin yhtäläisyyttä. Nämä kaksi objektia ovat samanarvoisia, jos niillä on sama muistiosoite.

Syntaksi:

 public boolean equals(Object obj) 

Menetelmä jäsentää referenssiobjektin parametriksi. Se palauttaa tosi, jos objektit ovat yhtä suuret, muussa tapauksessa palauttaa epätosi.

On myös mahdollista, että objekti on yhtä suuri kuin toinen annettu objekti, jolloin equals()-metodi seuraa ekvivalenssisuhde vertailla esineitä.

    Refleksiivinen:Jos x on ei-null-viite, kutsu x.equals(x) täytyy palata tosi.Symmetrinen:Jos kaksi ei-nollaviittausta ovat x ja y, x. on yhtä kuin (y) palaa totta jos ja vain jos y. on yhtä kuin (x) palata totta .Transitiivinen:Jos kolme ei-nollaviittausta ovat x,y , ja z, x. on yhtä kuin (z) tulee myös takaisin totta jos x.equals(y ) ja y. on yhtä kuin (z) molemmat palaavat totta .Johdonmukainen:Jos kaksi ei-nollaviittausta ovat x ja ja , useita kutsuja x.on yhtä kuin (y) palauttaa jatkuvasti joko tosi tai epätosi. Se ei anna vertailussa käytettyjä tietoja.
  • Kaikille ei-null-viittauksille x, x.equals(null) palauttaa false.

Lyhyesti sanottuna, ei-null viittaus sanoa x ja ja , se palauttaa tosi, jos ja vain jos molemmat viittaukset viittaavat samaan objektiin.

Muistaa: Kun ohitamme equals()-menetelmän, on välttämätöntä ohittaa hashCode()-metodi. Ohitus noudattaa hashCode()-metodin käytäntöä, jonka mukaan yhtäläisellä objektilla on oltava sama hash-koodi.

Esimerkki equals()-menetelmästä

Seuraavassa esimerkissä olemme luoneet rakentaja -lta Kaksinkertainen ja Pitkä luokkaan ja välittää vastaavat arvot argumenttina, joka on tallennettu niiden objekteihin.

Tämän jälkeen ensimmäisessä println-käskyssä olemme kutsuneet equals()-metodin ja jäsentäneet objektin y parametriksi, joka vertaa objektia x ja y. Se palaa väärä koska x:llä on kaksinkertainen arvo ja y:llä on pitkä arvo, joka ei ole sama.

Vastaavasti toisessa println-käskyssä olemme kutsuneet equals()-metodin ja jäsentäneet saman arvon kuin Double-luokan konstruktorissa. Se palaa totta koska kaksoisluokan objektilla eli x:llä on sama arvo, jonka olemme hyväksyneet equals()-metodissa.

ObjectComparisonExample.java

java pää
 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)); } } 

Lähtö:

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

Ero == Operaattorin ja equals()-metodin välillä

Sisään Java , == operaattori vertaa, ovatko kaksi viittausta identtisiä vai eivät. Kun taas on yhtä suuri () menetelmä vertaa kahta objektia.

Objektit ovat yhtä suuri kun niillä on sama tila (yleensä muuttujien vertailu). Objektit ovat identtinen kun he jakavat luokan identiteetin.

Esimerkiksi ilmaisu obj1==obj2 testaa identiteettiä, ei tasa-arvoa. Vaikka ilme obj1.equals(obj2) vertaa tasa-arvoa.

Java hashCode() -menetelmä

Javassa hash-koodi on 32-bittinen etumerkillinen kokonaislukuarvo. Se on ainutlaatuinen tunnus, jonka tarjoaa JVM Java-objektiin. Jokainen Java-objekti liittyy hash-koodiin. Hash-koodia hallitaan hash-pohjaisella tietorakenteella, kuten HashTable, HashSet jne.

Muistaa: Kun ohitamme equals()-menetelmän, on välttämätöntä ohittaa myös hashCode()-metodi.

Syntaksi:

alfa-beta karsiminen
 public int hashCode() 

Se palauttaa objektin satunnaisesti luodun hash-koodin arvon, joka on ainutlaatuinen jokaiselle esiintymälle. Satunnaisesti luotu arvo saattaa muuttua ohjelman useiden suoritusten aikana.

HashCoden yleinen sopimus on:

  • Kun sitä kutsutaan useammin kuin kerran sovelluksen suorituksen aikana, hashCode()-metodi palauttaa johdonmukaisesti saman hash-koodin (kokonaislukuarvon). Huomaa, että objektia ei saa muokata.
  • Jos kaksi objektia ovat yhtä suuret equals()-metodin mukaan, hashCode()-menetelmän kutsumisen näille kahdelle objektille täytyy tuottaa sama kokonaisluku.
  • Ei ole välttämätöntä, että jos nämä kaksi objektia ovat eriarvoisia equals()-menetelmän mukaan, hashCode()-menetelmän kutsuminen näille kahdelle objektille voi tuottaa erillisen kokonaisluvun. Se tarkoittaa, että se voi tuottaa saman hash-koodin molemmille objekteille.

Esimerkki hashCode()-metodista

Seuraavassa esimerkissä olemme luoneet kaksi luokkaa Työntekijä.java ja HashCodeExample.java .

Työntekijä-luokassa olemme määritelleet kaksi kenttää regno, joiden tyyppi on int ja nimi String. Tämän jälkeen olemme luoneet Työntekijä-luokan konstruktorin ja välitämme nämä kaksi kenttää parametreina.

java lisäysmerkkijono

Objektien vertailua varten olemme luoneet erillisen luokan nimeltä HashCodeEsimerkki . Tällä luokalla olemme luoneet kaksi esiintymää Employee-luokasta, ts. emp1 ja emp2 . Tämän jälkeen olemme käynnistäneet hashCode()-metodin käyttämällä objekteja. Olemme tallentaneet hash-koodin arvon muuttujaan a ja b , vastaavasti.

Työntekijä.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)); } } 

Lähtö:

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

Ohitus equals() -menetelmä

Voimme ohittaa equals()-menetelmän seuraavalla tavalla, jos haluamme tarjota oman toteutuksen.

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

Yllä oleva koodinpätkä osoittaa, että kaksi työntekijää on tasa-arvoinen, jos heidät on tallennettu samaan muistiosoitteeseen tai heillä on sama regno. Kun suoritamme ohjelman (HashCodeExample.java) yllä olevan koodinpätkän kanssa, saamme seuraavan tulosteen.

Lähtö:

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