Sobes.tech
Middle

Vai o HashMap funcionar se todas as chaves adicionadas tiverem o mesmo hashCode()?

sobes.tech IA

Resposta da IA

Sim, haverá.

Com um hashCode() idêntico, todos os elementos irão para a mesma "caixa" (bucket) no HashMap. Isto levará a que o HashMap degrade para uma lista ligada (ou uma árvore, se houver elementos suficientes e estiver a usar Java 8+ com TreeNode), o que deteriora significativamente o desempenho das operações put(), get(), remove() até O(n) em vez de O(1) na média.

Assim, o HashMap funcionará corretamente, mas perderá a sua principal vantagem em velocidade devido às colisões de hash. Para distinguir objetos com o mesmo hash, é utilizado o método equals().

class BadHashKey {
    private String name;

    public BadHashKey(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return 1; // Sempre retorna o mesmo código de hash
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BadHashKey that = (BadHashKey) o;
        return name.equals(that.name); // Verifica igualdade pelo nome
    }

    @Override
    public String toString() {
        return "BadHashKey{" +
               "name='" + name + '\'' +
               '}';
    }
}

// Exemplo de uso
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Ambas as chaves estarão na mesma caixa
// String value = map.get(new BadHashKey("key1")); // A busca será lenta