![translation](https://cdn.durumis.com/common/trans.png)
Esta es una publicación traducida por IA.
equals() vs hashCode()
- Idioma de escritura: Coreano
- •
-
País de referencia: Todos los países
- •
- Tecnología de la información
Seleccionar idioma
Texto resumido por la IA durumis
- equals() es un método que compara si el contenido de los objetos es el mismo, y hashCode() es un método que devuelve un valor entero único para cada objeto, y ambos se utilizan para comparar objetos.
- En las estructuras de datos hash, hashCode() se utiliza para determinar la clave, por lo que es necesario redefinir equals() y hashCode() juntos para garantizar el mismo código hash.
- El uso conjunto de equals() y hashCode() permite gestionar de forma eficiente objetos idénticos en estructuras de datos hash.
equals()
equals() compara el contenido de los objetos. A menudo se llama comparación de igualdad y, si no se redefine equals(), internamente es igual que ==, por lo que es una comparación de identidad. Por lo tanto, si desea comparar objetos de manera igual, debe usar equals().
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() verifica si dos objetos son el mismo objeto. Realiza la misma función de comparación de identidad que ==, pero el método hashCode() devuelve un valor entero único del objeto en tiempo de ejecución como valor de retorno. Generalmente devuelve la dirección de memoria del objeto almacenado en Heap.
Este método tiene la palabra clave nativa adjunta, lo que significa que se usa cuando se usa un lenguaje desarrollado en un lenguaje que no sea Java en Java.
¿Qué es el hash?
El hash es el proceso de usar una función hash para generar un valor de salida de tamaño fijo a partir de un valor de entrada de tamaño variable. El valor obtenido a través del hash se llama código hash.
equals() y hashCode()
Dado que los objetos idénticos deben tener la misma dirección de memoria, es obvio que los objetos idénticos deben tener el mismo código hash. Por lo tanto, es deseable escribir código que garantice el mismo código hash redefiniendo hashCode() junto con equals().
Estructura de datos 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);
}
Insertaremos dos objetos iguales en la estructura de datos HashSet como se muestra arriba. Si imprimimos el tamaño de este conjunto, saldrá 2. ¿Por qué?
Esto se debe a que la estructura de datos que usa el hash usa hashCode() para determinar la clave. Es decir, antes de comparar si los objetos son iguales, compara si los códigos hash de los dos objetos son iguales y luego determina si los dos objetos son iguales. En este caso, si hashCode() no se redefine, se usa hashCode() de Object, por lo que se devuelve la dirección de memoria donde se almacenó cada objeto. Por lo tanto, es una buena práctica redefinir hashCode() junto con equals() para usar la estructura de datos 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);
}
Fuente
Preguntas y respuestas de la entrevista esperadas
¿Por qué equals() y hashCode() se usan juntos?
Esto se debe a que la estructura de datos que usa el hash usa hashCode() para determinar la clave. Es decir, antes de comparar si los objetos son iguales, compara si los códigos hash de los dos objetos son iguales y luego determina si los dos objetos son iguales. En este caso, si hashCode() no se redefine, se usa hashCode() de Object, por lo que se devuelve la dirección de memoria donde se almacenó cada objeto. Por lo tanto, es una buena práctica redefinir hashCode() junto con equals() para usar la estructura de datos hash.