Junior — Middle
Ինչպես է իրականացնում կլիշների մշակումը HashMap-ում, երբ տարբեր բանալիները ունեն նույն հեշ-կոդը:
sobes.tech AI
Պատասխան AI-ից
Java-յում, HashMap-ում բախումների կառավարումը, երբ հեշ-կոդերը նույնն են, իրականացվում է chaining (շղթայազերծում) մեթոդով: Սա նշանակում է, որ բոլոր այն տարրերը, որոնց հեշ-կոդը միևնույն ինդեքսին է հասցնում բաքի զանգվածում, պահվում են կապված ցանկում կամ ծառում (Java 8-ից սկսած) այդ բաքում:
Եթե շղթայի տարրերի թիվը դառնում է բավականին մեծ (դեպքում default ավելի քան 8), կապված ցանկը փոխարկվում է հավասարակշռված ծառ (TreeNode), ինչը բարելավում է որոնման կատարողականությունը՝ փոխելով O(n)-ից՝ O(log n):
Պարզեցված ներդրման օրինակ՝
int bucketIndex = hash(key) % table.length;
Node<K,V> head = table[bucketIndex];
// Ստուգում ենք, արդյոք բանալի արդեն կա շղթայում
while (head != null) {
if (head.key.equals(key)) {
head.value = value; // արժեքը թարմացնել
return;
}
head = head.next;
}
// Եթե բանալին չկա, ավելացնում ենք նոր հանգույց սկզբում
Node<K,V> newNode = new Node<>(key, value);
newNode.next = table[bucketIndex];
table[bucketIndex] = newNode;
Այսպիսով, HashMap արդյունավետ կերպով կառավարում է բախումները՝ պահպանելով ընդունելի կատարողականություն։