Sobes.tech
Middle

Werkt de HashMap als alle toegevoegde sleutels dezelfde hashCode() hebben?

sobes.tech AI

Antwoord van AI

Ja, dat zal.

Met een hashCode() die hetzelfde is, zullen alle elementen in dezelfde "bak" (bucket) in HashMap terechtkomen. Dit zal ertoe leiden dat HashMap degradeert tot een gekoppelde lijst (of een boom, als er genoeg elementen zijn en Java 8+ met TreeNode wordt gebruikt), wat de prestaties van put(), get(), remove() aanzienlijk zal verslechteren tot O(n) in plaats van O(1) gemiddeld.

Dus, HashMap zal correct functioneren, maar zal zijn belangrijkste snelheidvoordeel verliezen door hash-collisies. Om objecten met dezelfde hash te onderscheiden, wordt de methode equals() gebruikt.

class BadHashKey {
    private String name;

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

    @Override
    public int hashCode() {
        return 1; // Altijd dezelfde hash-code
    }

    @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); // Controleer op gelijkheid op naam
    }

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

// Voorbeeld van gebruik
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Beide sleutels in dezelfde bak
// String value = map.get(new BadHashKey("key1")); // Zoekopdracht zal langzaam zijn