Assunto muito batido, mas vi que é presença marcante no exame, e muito importante no dia-a-dia. Até porque todo projeto java usa API de Collection (nunca conheci nenhuma que não usasse), logo para fazer um bom uso de ordenação, mapeamento chave x valor, exclusão de repetição, etc.. , se faz necessário implementar pelo menos o método equals, e sempre é bom implementar o hashCode tb.
Pra começar, vamos ver a assinatura dos dois métodos:
public boolean equals (Object o)
public int hashCode()
Logo, a primeira coisa para sobrescrever esses métodos, a classe filha deve usar uma assinatura igual. Algo como abaixo, daria erro de compilação por violar a regra de sobrescrita.
protected boolean equals(Object o)
Outro perigo tb:
int a = 2;
Integer b = 2;
b.equals(a); //imprime true, compila perfeito, usa autobox
a.equals(b);//não compila, a é um primitivo não possui método equals
Continuando, equals tem uma única utilidade: Dizer se dois objetos são ou não iguais. Caso, vc não o sobrescreva o equals da classe Object por padrão testa a referência. Logo, se duas variáveis apontam para a mesma referência, equals retornará verdadeira.
hashCode também tem a sua implementação padrão, porém ela está intimimante ligada a perfomance. Imagina várias caixas numeradas, e dentro varias bolas. Se vc pretende inserir uma bola nova numerada, vc vai na caixa marcada e dentro vc ordena com mais facilidade e de forma mais rápida. O princípio é o mesmo, com hashCode, o int que o método retorna diz para o java em qual grupo deve-se achar aquele objeto, e daí roda o equals para todo elemento de dentro da caixa.
Para o exame, provavelmente algo falando sobre contrato do equals e hashCode vai cair. Contrato é o conjunto de regras que dizem se esse dois métodos foram implementados de maneira correta. Não necessariamente forma correta é estar só compilando.
A principal das regras é a que diz: “Caso dois objetos são iguais através do método equals, então seu hashCodes devem ser iguais” e “Se dois objetos pelo método equals são diferentes, nada pode-se dizer à respeito do hashCode”.
Coisas estranhas do tipo:
public int hashCode(){
return Math.random(x);
}
Violam também o contrato, pois imagine que pra cada vez que equals for chamado numa instância do objeto que o contém, ele terá um hashCode diferente…
Assunto Fácil! Acho que por hoje é só…
Importante, Caso vc nao sobrescreva equals ou hashCode:
A implementação padrão de equals compara duas referências. Duas referências são iguais se elas apontam para o mesmo objeto.
A implementação padrão de hashCode retorna um valor inteiro diferente para cada instância, ou seja, para que uma coleção como uma HashSet elimini elementos repetidos, se faz necessário a implementação dos dois métodos.