Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

HashCode e Equals()

Boa tarde,

1º - Para que um objeto seja igual ao outro, o hashcode deve ser o mesmo ?

2º - Para dizermos que um objeto é igual ao outro, precisamos criar um critério, no meu caso se o nome for igual.

public boolean equals(Object obj){
    Aluno other = (Aluno) obj;
    return this.nome.equals(other.nome);
}

E no meu método de hashcode eu criei automatico:

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        return result;
    }

Na minha classe main eu instanciei dois objetos:

Aluno a3 = new Aluno("Alan", 2);
Aluno a4 = new Aluno("Alan", 2);

Em tempo de compilação, o compilador sabe que eu passei o nome igual para os dois objetos e atribui o mesmo hashcode ?

3º - Quando nós temos dois objetos equals com o mesmo hashcode. Ele continua com duas referências na memória ou um objeto apontando para mesma referência ?

Muito obrigado!

6 respostas

1º - Para que um objeto seja igual ao outro, o hashcode deve ser o mesmo ? Não e sim. O equals deve retornar true, isso é suficiente para dizer que dois objetos são iguais. Entretanto, se dois objetos são iguais é esperado que o hascode deles também seja o mesmo.

2º - Para dizermos que um objeto é igual ao outro, precisamos criar um critério, no meu caso se o nome for igual. Em tempo de compilação, o compilador sabe que eu passei o nome igual para os dois objetos e atribui o mesmo hashcode ? Não. Em tempo de compilação o código é apenas validado, nenhuma lógica é verificada.

3º - Quando nós temos dois objetos equals com o mesmo hashcode. Ele continua com duas referências na memória ou um objeto apontando para mesma referência ? 2 referências.

Vlw Alberto.

Aluno a1 = new Aluno("Alan", 2);
Aluno a2 = new Aluno("Alan", 2);
Aluno a3 = new Aluno("AlanMiranda", 2);

System.out.println(a1.hashCode());
System.out.println(a2.hashCode());
System.out.println(a3.hashCode());

a1 = 2043351
a2 = 2043351
a3 = 1561272855

A saída foi o mesmo hashcode. Acho que foi formulei errado a pergunta anteriormente, seria:

Alterando o método equals, ao criar um objeto novo, ele verificar por o nome se é igual e atribui o mesmo hashcode ?

Devo implementar o método hashcode somente quando estiver trabalhando com Hash ?

Opa, perdão pela demora. Ele não atribui o hashcode, ele é um método que possui uma lógica. No caso da sua classe a lógica leva em consideração o atributo nome da classe e, por conta disso, a saída é a mesma. Mas lembre, cada vez que você chama o método hashcode dessa classe, a lógica é executada novamente.

Vlw alberto. Devo implementar o método hashcode somente quando estiver trabalhando com Hash ?

solução!

Geralmente sim. Hash ou Set.