Métodos hashcode() e equals

Pessoal, eu estava analisando um código e me deparei com o método:


public boolean  equals( Object o )
{ 
        if ( o instanceof Devel )
        {
             ...
        }
}

e esse outro que me parece ter relação com um primeiro, pesquisando eu descobri que saum métodos herdados da class Object:


public int hashCode()
{
       return nome.hashCode()
}

Alguém poderia me dar uma ajuda sobre o funcionamento desses métodos?
Valeu

o primeiro metodo 

public void equals(Object objecto){

//recebe qualquer objeto

if(object instanceof Devel){

//e compara se esse objeto e uma instancia
//da classe Devel

}


}

O segundo 

public int hashCode(){

return nome.hashcode();
//retorna o codego de hash do objecto
//um codego unico para ser usado em pesquisas
//encontrar o objeto;

}

O equals é um método que compara se um objeto é igual a outro. Se você não sobrescrever, é usada a implementação padrão de Object, que é “um objeto é igual a outro caso seja a mesma instância na memória”. Caso precise de uma comparação mais detalhada, você deve sobrescrever o método a seu modo (por exemplo, dois objetos pessoas são iguais se tiverem o mesmo cpf). Lembrando que a relação de igualdade deve ser reflexiva, simétrica e transitiva.

O hashCode é um método que retorna um código hash de um objeto. Sempre que sobrescrever o equals, sobrescreva também o hashCode. Ele é usado normalmente para agilar a busca em collections.

2 curtidas

Olá Fabio e José,

    Obrigado pela ajuda, uma duvida que eu tive quanto ao codigo que eu estava analisando é pq Devel naum era uma classe e sim uma interface, ou seja, a gente naum instancia a interface, por isso fiquei meio confuso com o instanceof, quanto ao hashcode, ficou mais esclarecido, mas ainda naum tenho clareza quanto a relação entre os dois,  José, vou ler o seu artigo,

Grato,
Samuel

Pessoal, tenho dúvidas também em relação ao método equals, alguém poderia me dar um exemplo de como fazer uma comparação entre dois valores inteiros de Arrays distintos, utilizando esse método?

[code]int[] Vetor_1 = new int[3];

int[] Vetor_2 = new int[3];

Vetor_1[0] = 5;
Vetor_2[0] = 3; // Valores a serem comparados
[/code]

Abraço

if (Vetor_1[0] == Vetor_2[0]) System.out.println("Iguais!");

Só complementando, essa obrigação existe porque a função de hashcode deve retornar valores iguais para objetos iguais (é para isso que ela serve).
Ou seja se:

a.equals(b);

Então

a.hashCode() == b.hashCode()

Note que o contrário pode não ser verdadeiro. Dois objetos de hashCode iguais não necessariamente são iguais, embora, numa boa função de hash isso será muito provável.

Quanto ao equals… testar com instanceOf pode quebrar uma das premissas do equals que diz:

Se a.equals(b) então b.equals(a)

Portanto, isso recai numa implementação errada. Deixo como lição de casa para você achar um caso onde usando instanceof essa propriedade não valha.

[quote=Lavieri]if (Vetor_1[0] == Vetor_2[0]) System.out.println("Iguais!");[/quote]

Só isso Lavieri?! :smiley:

Fico ateh envergonhado.

Brigado,

Vlw!

valores primitivos são testado via == … ou seja… boolean, int, double, long, char, short … etc …

Objetos que precisam ser testaod via equals

[quote=Lavieri]valores primitivos são testado via == … ou seja… boolean, int, double, long, char, short … etc …

Objetos que precisam ser testaod via equals[/quote]

Claro, claro - eh pq eu tava c a ideia do objeto Array na cabeça, q acabei me esquecendo dos tipos primitivos. :-o

Vlw!

será que posso colocar mais uma dúvida aqui?
no caso eu estou fazendo comparações entre dois objetos:

Conta conta1 = new Conta();
conta1.nome = "Duke";
conta1.saldo = 1000.0;

Conta conta2 = new Conta();
conta2.nome = "Duke";
conta2.saldo = 1000.0;

eu sei que a comparação == entre os dois objetos não terá validade, acredito que teria que utilizar o método .equals

if(conta1.equals(conta2))
    System.out.println("Contas iguais");
else
    System.out.println("Contas não iguais");

porém fazendo dessa forma, não consigo o retorno [color=blue]true[/color].

Sei também que se fizer assim:

[code]Conta conta1 = new Conta();
conta1.nome = “Duke”;
conta1.saldo = 1000.0;

Conta conta2 = new Conta();
conta2=conta1;
[/code]
o objeto conta2 é a mesma posição de conta1, e por isso q retorna valor [color=blue]true[/color].

agora que vem a questão: Qual a forma de comparar 2 objetos por completo? :wink: :wink:

Se você quiser que duas contas sejam consideradas iguais se possuem mesmo dono e mesmo saldo (acho que o mais correto seria verificar pelo número da conta + número da agência + nome do banco), basta fazer um método que verifique essas condições, ou sobrescreva o equals.

Esse post do do link http://blog.caelum.com.br/ensinando-que-e-o-hashcode/ … Está com uma péssima didática.
Parece que tem gente que faz artigos/tutoriais pra quem já sabe!

[quote=andrestrindade]Esse post do do link http://blog.caelum.com.br/ensinando-que-e-o-hashcode/ … Está com uma péssima didática.
Parece que tem gente que faz artigos/tutoriais pra quem já sabe![/quote]

Ola pessoal segue um post que explica em datalhes o metodo equals no blog Cursaki