Por dentro do Hashcode

2 respostas
P

Pessoal, criei este post somente porque não encontrei resposta pra minha dúvida em nenhum outro lugar.

Tenho o seguinte código:

public class Simulador {

    public static void main(String[] args) {
        Foo foo1 = new Foo("a");
        Foo foo2 = new Foo("a");
        HashSet<Foo> set = new HashSet<Foo>();
        set.add(foo1);
        set.add(foo2);
        for (Foo foo : set) {
            System.out.println(foo.equals(foo1));
            System.out.println(foo.equals(foo2));
        }
    }
}

class Foo {

    public String str;

    public Foo(String a) {
        str = a;
    }

    @Override
    public boolean equals(Object o) {
        return str.equals(((Foo) o).str);
    }

    @Override
    public int hashCode() {
        return Calendar.getInstance().get(Calendar.SECOND);
    }
}

Eis que ao executar ele exibe na saída: true true
Porém se eu depurar o código linha por linha, ele exibe: true true true true
Ainda não entendi o que ocorre “por trás das câmeras” do Hashcode. Alguém pode me explicar como ele realmente funciona, por exemplo no meu código acima?
Sei que se o método equals retorna true, o hashcode deve retornar o mesmo inteiro. Porém eu implementei de uma forma que isso não ocorra. Qual o impacto?

2 Respostas

tveronezi
P

Ok tveronezi, entendi. Só me responda mais uma coisa então:

Porque dizem que coleções que usam código hash podem iterar mais rápido, porém adicionar e remover elementos mais lentamente?
Como funciona a iteração das que utilizam hash em relação das que não utilizam?

Obrigado pela ajuda!

Criado 15 de agosto de 2012
Ultima resposta 16 de ago. de 2012
Respostas 2
Participantes 2