logo

Come confrontare due oggetti in Java

Oggetto Java class è la superclasse di tutte le classi Java. Tutte le classi Java implementano la classe Object per impostazione predefinita. La classe Java Object fornisce i due metodi importanti per confrontane due oggetti in Java , cioè. equivale() E codice hash() metodo. In questa sezione impareremo come equivale() E codice hash() il metodo funziona. Insieme a questo, impareremo anche come confrontare due oggetti in Java con esempi adeguati.

Java fornisce i due metodi della classe Object per confrontare gli oggetti sono i seguenti:

  • Metodo Java equals()
  • Metodo Java hashCode()

Metodo Java equals()

IL equivale() Il metodo della classe Object confronta l'uguaglianza di due oggetti. I due oggetti saranno uguali se condividono lo stesso indirizzo di memoria.

Sintassi:

 public boolean equals(Object obj) 

Il metodo analizza un oggetto di riferimento come parametro. Restituisce vero se gli oggetti sono uguali, altrimenti restituisce falso.

È anche possibile che un oggetto sia uguale a un altro dato oggetto, quindi il metodo equals() segue il metodo relazione di equivalenza per confrontare gli oggetti.

converti il ​​carattere in una stringa java
    Riflessivo:Se X è un riferimento non nullo, la chiamata di x.uguale(x) deve restituire vero.Simmetrico:Se i due riferimenti non nulli sono X E y, x.uguale(y) sarà di ritorno VERO se e solo se y.uguale(x) ritorno VERO .Transitivo:Se i tre riferimenti non nulli lo sono x, y , E z, x.uguale(z) ritornerà anche VERO Se x.uguale(y ) E y.uguale(z) entrambi i ritorni VERO .Coerente:Se i due riferimenti non nulli sono X E E , la chiamata multipla di x.uguale(y) restituisce costantemente vero o falso. Non fornisce alcuna informazione utilizzata nel confronto.
  • Per qualsiasi riferimento non nullo x, x.uguale(null) restituisce falso.

In breve, per qualsiasi riferimento non nullo dire X E E , restituisce true se e solo se entrambi i riferimenti si riferiscono allo stesso oggetto.

Ricordare: Quando sovrascriviamo il metodo equals(), è necessario sovrascrivere il metodo hashCode(). L'override segue la convenzione per il metodo hashCode() che afferma che l'oggetto uguale deve avere lo stesso codice hash.

Esempio del metodo equals()

Nell'esempio seguente, abbiamo creato costruttore del Doppio E Lungo class e passa i valori corrispondenti, come argomento memorizzato rispettivamente nei loro oggetti.

Successivamente, nella prima istruzione println, abbiamo invocato il metodo equals() e analizzato un oggetto y come parametro che confronta l'oggetto xey. Ritorna falso perché x contiene il valore double e y contiene il valore long che non è uguale.

Allo stesso modo, nella seconda istruzione println, abbiamo invocato il metodo equals() e analizzato lo stesso valore del costruttore della classe Double. Ritorna VERO perché l'oggetto della classe double, cioè x, contiene lo stesso valore che abbiamo passato nel metodo equals().

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

Produzione:

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

Differenza tra == Operatore e metodo equals()

In Giava , IL == L'operatore confronta che due riferimenti sono identici o meno. Mentre il equivale() Il metodo confronta due oggetti.

Gli oggetti sono pari quando hanno lo stesso stato (di solito confrontando le variabili). Gli oggetti sono identico quando condividono l'identità della classe.

Ad esempio, l'espressione oggetto1==oggetto2 mette alla prova l’identità, non l’uguaglianza. Mentre l'espressione oggetto1.uguale(oggetto2) confronta l'uguaglianza

Metodo Java hashCode()

In Java, il codice hash è un valore intero con segno a 32 bit. È un ID univoco fornito da JVM all'oggetto Java. Ogni oggetto Java è associato al codice hash. Il codice hash è gestito da una struttura dati basata su hash, come HashTable, HashSet, ecc.

Ricordare: Quando sovrascriviamo il metodo equals(), è necessario sovrascrivere anche il metodo hashCode().

Sintassi:

 public int hashCode() 

Restituisce un valore del codice hash generato casualmente dell'oggetto che è univoco per ogni istanza. Il valore generato casualmente potrebbe cambiare durante le diverse esecuzioni del programma.

Il contratto generale per hashCode è:

  • Quando viene invocato più di una volta durante l'esecuzione di un'applicazione, il metodo hashCode() restituirà costantemente lo stesso codice hash (valore intero). Tieni presente che l'oggetto non deve essere modificato.
  • Se i due oggetti sono uguali secondo il metodo equals(), l'invocazione del metodo hashCode() su questi due oggetti deve produrre lo stesso valore intero.
  • Non è necessario che se i due oggetti sono diversi secondo il metodo equals(), invocare il metodo hashCode() su questi due oggetti può produrre un valore intero distinto. Significa che può produrre lo stesso codice hash per entrambi gli oggetti.

Esempio del metodo hashCode()

Nell'esempio seguente abbiamo creato due classi Dipendente.java E HashCodeExample.java .

Nella classe Employee abbiamo definito due campi regno di tipo int e nome di tipo String. Successivamente, abbiamo creato un costruttore della classe Employee e passiamo questi due campi come parametro.

Per eseguire il confronto degli oggetti, abbiamo creato una classe separata denominata HashCodeEsempio . In questa classe, abbiamo creato due istanze della classe Employee, ad es. emp1 E emp2 . Successivamente, abbiamo invocato il metodo hashCode() utilizzando gli oggetti. Abbiamo memorizzato il valore del codice hash nella variabile UN E B , rispettivamente.

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

Produzione:

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

Sostituzione del metodo equals()

Possiamo sovrascrivere il metodo equals() nel modo seguente se vogliamo fornire la nostra implementazione.

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

Il frammento di codice sopra mostra che due dipendenti saranno uguali se sono archiviati nello stesso indirizzo di memoria o se hanno lo stesso regno. Quando eseguiamo il programma (HashCodeExample.java) con lo snippet di codice sopra, otteniamo il seguente output.

Produzione:

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