Middle
Quais são as regras para os métodos equals e hashCode?
sobes.tech IA
Resposta da IA
- Se dois objetos forem iguais pelo método
equals(Object), os seus códigos de hash (retornados pelo métodohashCode()) devem ser iguais. - Se dois objetos não forem iguais pelo método
equals(Object), os seus códigos de hash podem ser iguais ou diferentes. É uma boa prática garantir códigos de hash diferentes para objetos não iguais para melhorar o desempenho das coleções baseadas em hash. - O método
hashCode()deve retornar valores iguais para o mesmo objeto em múltiplas chamadas, desde que nenhuma informação usada para calcular o código de hash tenha mudado. - Simetria: para quaisquer objetos
aeb, sea.equals(b)fortrue, entãob.equals(a)também deve sertrue. - Reflexividade: para qualquer objeto não nulo
a,a.equals(a)deve sertrue. - Transitividade: para quaisquer objetos
a,bec, sea.equals(b)fortrueeb.equals(c)fortrue, entãoa.equals(c)também deve sertrue. - Consistência: para quaisquer objetos não nulos
aeb, múltiplas chamadas aa.equals(b)devem retornar de forma consistentetrueoufalse, desde que as informações usadas nas comparaçõesequals(Object)não tenham mudado.
Exemplo de implementação:
public class MyClass {
private int value;
private String name;
public MyClass(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Verificação de identidade de objetos
if (this == o) {
return true;
}
// Verificação do tipo do objeto
if (o == null || getClass() != o.getClass()) {
return false;
}
// Casting para o tipo correto
MyClass myClass = (MyClass) o;
// Comparação por campos
return value == myClass.value &&
Objects.equals(name, myClass.name); // Usamos Objects.equals para tratar nulls
}
@Override
public int hashCode() {
// Uso de Objects.hash para gerar o hash code com base nos campos
return Objects.hash(value, name);
}
// Outros métodos...
}