Fale sobre os contratos dos métodos equals e hashCode em Java.
sobes.tech IA
Resposta da IA
-
Reflexividade: para qualquer valor de referência não nulo
x,x.equals(x)deve retornartrue. -
Simetria: para quaisquer valores de referência não nulos
xey,x.equals(y)deve retornartruese e somente sey.equals(x)retornartrue. -
Transitividade: para quaisquer valores de referência não nulos
x,yez, sex.equals(y)retornatrueey.equals(z)retornatrue, entãox.equals(z)deve retornartrue. -
Consistência: para quaisquer valores de referência não nulos
xey, chamadas múltiplas ao métodox.equals(y)devem retornar consistentementetrueoufalse, desde que nenhuma informação usada nas comparaçõesequalsnos objetos seja alterada entre as chamadas. -
Para qualquer valor de referência não nulo
x,x.equals(null)deve retornarfalse. -
Se dois objetos são iguais de acordo com o método
equals(Object), então a chamada do métodohashCodepara cada um dos dois objetos deve fornecer o mesmo valor inteiro. -
Não é necessário que, se dois objetos não forem iguais de acordo com o método
equals(java.lang.Object), a chamada do métodohashCodepara cada um dos dois objetos forneça valores inteiros diferentes. No entanto, o programador deve entender que gerar códigos hash diferentes para objetos não iguais pode melhorar o desempenho das tabelas hash.
É importante sobrescrever ambos os métodos equals e hashCode se um deles for sobrescrito, para manter o contrato. Usar equals sem sobrescrever hashCode pode levar a um funcionamento incorreto das coleções que usam hashing (por exemplo, HashMap, HashSet).
public class Person {
private String name;
private 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; // Reflexividade
if (o == null || getClass() != o.getClass()) return false; // Verificação de null e tipo
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Comparação por conteúdo
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Geração de hash com base nos campos
}
}