Sobes.tech
Junior — Middle

Hogyan valósul meg a kollíziókezelés a HashMap-ben, amikor különböző kulcsok ugyanazzal a hash-kóddal rendelkeznek?

sobes.tech MI

Válasz az MI-től

Java-ban a HashMap-ben az ütközések kezelése, amikor a hash-kódok megegyeznek, láncolással (chaining) valósul meg. Ez azt jelenti, hogy minden olyan elem, amelynek hash-kódja ugyanoda mutat a tömbben, egy összekapcsolt listában vagy (Java 8-tól kezdődően) egy fában tárolódik ebben a bucketben.

Ha a láncban lévő elemek száma elég nagy lesz (alapértelmezés szerint több mint 8), akkor a láncolt lista egy kiegyensúlyozott fára (TreeNode) alakul át, ami javítja a keresési teljesítményt O(n)ről O(log n)-re.

Egyszerűsített beszúrási logika példája:

int bucketIndex = hash(key) % table.length;
Node<K,V> head = table[bucketIndex];
// Ellenőrzi, hogy a kulcs már létezik-e a láncban
while (head != null) {
    if (head.key.equals(key)) {
        head.value = value; // érték frissítése
        return;
    }
    head = head.next;
}
// Ha a kulcs nem létezik, hozzáad egy új csomópontot a lista elejéhez
Node<K,V> newNode = new Node<>(key, value);
newNode.next = table[bucketIndex];
table[bucketIndex] = newNode;

Így a HashMap hatékonyan kezeli az ütközéseket, miközben elfogadható teljesítményt tart fenn.