![translation](https://cdn.durumis.com/common/trans.png)
Esta é uma postagem traduzida por IA.
Selecionar idioma
Texto resumido pela IA durumis
- equals() é um método que compara se o conteúdo de um objeto é o mesmo, e hashCode() é um método que retorna um valor inteiro exclusivo para um objeto, ambos são usados para comparar objetos.
- Em estruturas de dados hash, hashCode() é usado para determinar a chave. Portanto, equals() e hashCode() devem ser redefinidos juntos para garantir o mesmo código hash.
- Usar equals() e hashCode() juntos permite gerenciar objetos idênticos de forma eficiente em estruturas de dados hash.
equals()
equals() compara se o conteúdo de um objeto é o mesmo. Isso é comumente chamado de comparação de igualdade e, se equals() não for sobrescrito, ele é internamente igual a ==, portanto é uma comparação de identidade. Portanto, se você quiser comparar corretamente objetos de igualdade, você deve usar equals().
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() verifica se dois objetos são o mesmo objeto. Ele funciona como uma comparação de identidade como ==, mas o método hashCode() retorna um valor inteiro exclusivo do objeto em tempo de execução. Geralmente, ele retorna o endereço de memória do objeto armazenado no Heap.
Este método tem a palavra-chave native anexada, que é uma palavra-chave usada quando uma linguagem desenvolvida em outra linguagem que não Java é usada em Java.
O que é hash?
Hashing é o processo de usar uma função hash para gerar uma saída de tamanho fixo a partir de uma entrada de tamanho variável. O valor obtido por meio de hashing é chamado de código hash.
equals() e hashCode()
Objetos idênticos devem ter o mesmo endereço de memória, portanto é óbvio que objetos idênticos devem ter o mesmo código hash. Portanto, é recomendável escrever o código para garantir que o mesmo código hash seja garantido, sobrescrevendo hashCode() junto com equals().
Estrutura de dados hash
public class Main {
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("Jayon", 23));
people.add(new Person("Jayon", 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);
}
Vamos inserir dois objetos idênticos na estrutura de dados HashSet como mostrado acima. Se imprimirmos o tamanho desse Set, ele retornará 2. Por que?
Isso ocorre porque a estrutura de dados que usa hashing usa hashCode() para determinar a Key. Ou seja, antes de comparar se os objetos são idênticos, ele compara se os códigos hash dos dois objetos são os mesmos e, em seguida, determina se os dois objetos são iguais. Nesse caso, se hashCode() não for sobrescrito, Object hashCode() será usado, portanto o endereço de memória onde cada objeto é armazenado será retornado. Portanto, é melhor sobrescrever hashCode() além de equals() para quando você usa uma estrutura de dados hash.
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("Jayon", 23));
people.add(new Person("Jayon", 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
Perguntas e respostas esperadas da entrevista
Por que equals() e hashCode() são usados juntos?
Isso ocorre porque a estrutura de dados que usa hashing usa hashCode() para determinar a Key. Ou seja, antes de comparar se os objetos são idênticos, ele compara se os códigos hash dos dois objetos são os mesmos e, em seguida, determina se os dois objetos são iguais. Nesse caso, se hashCode() não for sobrescrito, Object hashCode() será usado, portanto o endereço de memória onde cada objeto é armazenado será retornado. Portanto, é melhor sobrescrever hashCode() além de equals() para quando você usa uma estrutura de dados hash.