Háblame sobre los contratos de los métodos equals y hashCode en Java.
sobes.tech AI
Respuesta de la IA
-
Reflexividad: para cualquier valor de referencia distinto de cero
x,x.equals(x)debe devolvertrue. -
Simetría: para cualquier par de valores de referencia distintos de cero
xyy,x.equals(y)debe devolvertruesi y solo siy.equals(x)devuelvetrue. -
Transitividade: para cualquier conjunto de valores de referencia distintos de cero
x,yyz, six.equals(y)devuelvetrueyy.equals(z)devuelvetrue, entoncesx.equals(z)debe devolvertrue. -
Consistência: para quaisquer valores de referência distintos de zero
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 distinto de zero
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
}
}