Metado equals()

Tava querendo sobrescrever o metado equals() para essa classe por exemplo

public class Usuario {
	private int id;
	private String login;
...
...
...
}

Fazendo dessa forma

	public boolean equals(Usuario usuario) {
		if( this.id == usuario.getId() && this.login.equals( usuario.login ) )
		   return true;
		else return false;
		
	}

só que na API fala que geralmente tenho de sobrescrever hashCode qd equals tbm é sobrescrito… nao entendi o porque…

fazendo isso que eu fiz posso ter erros futuros com meu objeto??
thanx

Meu bom, me deparei com sua dúvida faz alguns dias… E o que posso te dizer é que esta recomendação está ligada à manipulação de objetos em Collections como Map, HashMap, etc… Porque há um número de operações possíveis na hora de inserir ou buscar um objeto num Collection que pode fazer uso tanto do hashCode quanto do equals, portanto é recomendável que ao sobreescrever o equals que também se sobres-escreva o hashCode, de forma a manter um consistente com o outro.

No mais, Tudo de Bueno e Carpe Diem!
[color=“darkblue”][/color]

prefira usar o seguinte :

public boolean equals( Object obj ) { if( !(obj instanceof Usuario) ) return false; //... bla bla bla return true; }

[quote=“Hempx”]
Fazendo dessa forma…

[code]
public boolean equals(Usuario usuario) {
if( this.id == usuario.getId() && this.login.equals( usuario.login ) )
return true;
else return false;

}

[/code][/quote]

…voce vai ter uma dor de cabeca! Fazendo dessa forma, voce nao esta sobrescrevendo o metodo equals(Object), voce esta sobrecarregando “equals” e criando um novo metodo equals(Usuario)!

[quote]só que na API fala que geralmente tenho de sobrescrever hashCode qd equals tbm é sobrescrito… nao entendi o porque…
[/quote]

o motivo é que o equals() nao será chamado se o hashcode() nao estiver bem implementado :slight_smile:

o hashcode() é que informa qual a posição do objeto na tabela hash. Entao somente depois que tiver a posição o método equals() será chamado, fazendo a devida comparação.

Portanto se o hashcode() retornar um endereço errado, nao adianta implementar o equals() :!:

o motivo é que o equals() nao será chamado se o hashcode() nao estiver bem implementado :slight_smile:

o hashcode() é que informa qual a posição do objeto na tabela hash. Entao somente depois que tiver a posição o método equals() será chamado, fazendo a devida comparação.

Portanto se o hashcode() retornar um endereço errado, nao adianta implementar o equals() :!:[/quote]

Vlws moçada entendi… mas surgiu novas duvidas aqui

Como sou muito sortudo eu vou ter que mexer HashMap… hehe…
mas sei q da pra eu evitar esse transtorno… mas só por curiosidade alguem tem noção como posso fazer minha implementação do hashCode()… acho q já fiz algumas simples para tabelas pequenas…(usando mod). Mas deve ser bem mais complexos para tabelas grandes né… alguma sugestão ou alguns exemplos???

:arrow: outra coisa, fiquei na duvida aqui
na API fala

[quote] this method returns true if and only if x and y refer to the same object (x == y has the value true).
[/quote]

antes achava que equals era pra ver se tem o msm conteudo… e não se duas referencia aponta pro msm objeto em memória… estava eu errado?

o equals server para ver se dois objetos são iguais “conteúdo”, podem ter referências diferentes.

da uma olhada:
http://commonclipse.sourceforge.net/builders.html
http://codesugar.sourceforge.net/

[quote=“ricardolecheta”]o equals server para ver se dois objetos são iguais “conteúdo”, podem ter referências diferentes.

da uma olhada:
http://commonclipse.sourceforge.net/builders.html
http://codesugar.sourceforge.net/[/quote]

vlws brother… =) … justamente o que queria… :lol: :lol: