![translation](https://cdn.durumis.com/common/trans.png)
Questo è un post tradotto da IA.
equals() vs hashCode()
- Lingua di scrittura: Coreana
- •
-
Paese di riferimento: Tutti i paesi
- •
- Tecnologia dell'informazione
Seleziona la lingua
Testo riassunto dall'intelligenza artificiale durumis
- equals() is a method that compares whether the contents of an object are the same, and hashCode() is a method that returns a unique integer value for an object, and both are used to compare objects.
- In hash data structures, hashCode() is used to determine the key, so equals() and hashCode() should be overridden together to ensure the same hash code.
- Using equals() and hashCode() together allows you to efficiently manage identical objects in hash data structures.
equals()
equals() confronta se il contenuto degli oggetti è lo stesso. Comunemente chiamato confronto di uguaglianza, se equals() non viene sovrascritto, internamente è uguale a ==, quindi diventa un confronto identico. Pertanto, se vuoi confrontare correttamente gli oggetti per l'uguaglianza, devi assolutamente usare equals().
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() controlla se due oggetti sono lo stesso oggetto. Ha la stessa funzione di confronto identico come ==, ma il metodo hashCode() restituisce un valore intero univoco per l'oggetto durante l'esecuzione. Generalmente restituisce l'indirizzo di memoria dell'oggetto memorizzato nell'heap.
Il metodo ha la parola chiave nativa attaccata, che viene utilizzata quando si utilizza un linguaggio sviluppato in un linguaggio diverso da Java in Java.
Che cos'è l'hashing?
L'hashing è il processo di utilizzo di una funzione hash per generare un valore di output di dimensione fissa da un valore di input di dimensione variabile. Il valore ottenuto tramite l'hashing è chiamato codice hash.
equals() e hashCode()
Poiché lo stesso oggetto deve avere lo stesso indirizzo di memoria, è ovvio che lo stesso oggetto deve avere lo stesso codice hash. Pertanto, è consigliabile scrivere codice che sovrascriva anche hashCode() insieme a equals() per garantire lo stesso codice hash.
Struttura dati hash
public class Main {
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 2
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
Proviamo a inserire 2 oggetti uguali nella struttura dati HashSet come sopra. Se stampiamo la dimensione di questo Set, otterremo 2. Perché?
Questo perché la struttura dati che utilizza l'hashing utilizza hashCode() per determinare la chiave. In altre parole, prima di confrontare se gli oggetti sono identici, confronta se i codici hash dei due oggetti sono gli stessi e quindi determina se i due oggetti sono uguali. In questo caso, se hashCode() non è sovrascritto, verrà utilizzato hashCode() di Object, quindi verrà restituito l'indirizzo di memoria in cui è memorizzato ogni oggetto. Pertanto, è consigliabile sovrascrivere anche hashCode() oltre a equals() per i casi in cui si utilizza la struttura dati hash.
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 1
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
Fonte
Domande e risposte previste per l'intervista
Perché equals() e hashCode() vengono utilizzati insieme?
Questo perché la struttura dati che utilizza l'hashing utilizza hashCode() per determinare la chiave. In altre parole, prima di confrontare se gli oggetti sono identici, confronta se i codici hash dei due oggetti sono gli stessi e quindi determina se i due oggetti sono uguali. In questo caso, se hashCode() non è sovrascritto, verrà utilizzato hashCode() di Object, quindi verrà restituito l'indirizzo di memoria in cui è memorizzato ogni oggetto. Pertanto, è consigliabile sovrascrivere anche hashCode() oltre a equals() per i casi in cui si utilizza la struttura dati hash.