1
resposta

Dúvida sobre hashcode

Fiquei com algumas dúvida sobre o hashcode dos objetos se alguém puder me esclarecer agradeço muito, Se tenho uma classe aleatória chamada Fila, caso eu não sobreescreva o metodo toString, por padrão usará a da classe Object que na implementação

public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

No final dela depois do @ concatena uma string usando ali o hashCode

Primeira dúvida, se eu instancio um objeto do tipo Fila guardando na variável f e dou um print em f o resultado é: memoria.entities.Fila@1b6d3586 Certo, como esperado getClass().getName() nome da classe, string do @ e o hashcode, agora se eu utilizo f.hashcode() o resultado é: 460141958

Não deveria ser1b6d3586 ?

Segunda dúvida, por que o hashcode deve ser sobreescrito e ter uma padronização, entendi que é organizar os objetos por uma caracteristica por exemplo em um sistema bancário onde tem uma classe Conta com atributo inteiro numero, o hashcode poderia ser o proprio atributo numero, ou este atributo multiplicado por outro inteiro, gostaria de entender melhor o proposito disso, a principio estava achando que nós comparavamos os objetos pelo hashcode, mas entrei nas implementações da classe Integer e String e percebi que o hashcode não tem nada a ver na hora da implementação do equals, inclusive nas minhas proprias classes consegui implementar o equals sem o hashcode.

Obrigado.

1 resposta

Bom dia, João, sobre a primeira dúvida, o código sai diferente por conta do Integer.toHexString usado no toString.

Sobre a segunda duvida, é básicamente isso que você falou, quando você entrou nas implementações de Integer e String, eles não usam o hashCode mas por exemplo, o hashMap no momento de verificar se o objeto existe la dentro com o método containsKey, usa, então depende de quem você esta usando/olhando.

    public boolean containsKey(Object key) {
        return getNode(hash(key), key) != null;
    }
    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }