Sobes.tech
Middle

Vai HashMap darbosies, ja visi pievienotie atslēgas ir ar vienādu hashCode()?

sobes.tech AI

Atbilde no AI

Jā, būs.

Ar vienādu hashCode() visi elementi nonāks tajā pašā "groziņā" (bucket) HashMap. Tas novedīs pie HashMap degradācijas līdz saistītajam sarakstam (vai kokam, ja ir pietiekami daudz elementu un tiek izmantots Java 8+ ar TreeNode), kas būtiski pasliktinās put(), get(), remove() operāciju veiktspēju vidēji līdz O(n), nevis O(1).

Tādējādi HashMap darbosies pareizi, bet zaudēs savu galveno priekšrocību ātrumā dēļ haša kolīziju. Lai atšķirtu objektus ar vienādu hashCode(), tiek izmantota metode equals().

class BadHashKey {
    private String name;

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

    @Override
    public int hashCode() {
        return 1; // Vienmēr atgriež to pašu haša kodu
    }

    @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); // Pārbauda vienādību pēc nosaukuma
    }

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

// Piemērs izmantošanai
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Abi atslēgas būs tajā pašā "groziņā"
// String value = map.get(new BadHashKey("key1")); // Meklēšana būs lēna