Sobes.tech
Middle

Kas HashMap töötab, kui kõik lisatavad võtmed omavad sama hashCode()?

sobes.tech AI

Vastus AI-lt

Jah, see juhtub.

Kui hashCode() on sama, kõik elemendid satuvad samasse "ämbrisse" (bucket) HashMap-is. See viib HashMap-i lagunemiseni seotud nimekirjaks (või puuks, kui elemente on piisavalt palju ja kasutatakse Java 8+ TreeNode-ga), mis oluliselt halvendab put(), get(), remove() operatsioonide jõudlust keskmiselt kuni O(n), mitte O(1).

Seega töötab HashMap õigesti, kuid kaotab oma peamise eelise kiiruses hash-kollisioonide tõttu. Objektide erinevust sama hash-koodi korral tehakse equals() meetodi abil.

class BadHashKey {
    private String name;

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

    @Override
    public int hashCode() {
        return 1; // Alati tagastab sama hash-koodi
    }

    @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); // Kontrollib võrdlust nime järgi
    }

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

// Näide kasutamisest
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Mõlemad võtmed on samas "ämbris"
// String value = map.get(new BadHashKey("key1")); // Otsing on aeglane