Hash如何存數據 hash表的本質其實就是數組,hash表中通常存放的是鍵值對Entry。 如下圖: 這裡的學號是個key,哈希表就是根據key值來通過哈希函數計算得到一個值,這個值就是下標值,用來確定這個Entry要存放在哈希表中哪個位置。 Hash碰撞 hash碰撞指的是,兩個不同的值(比如張 ...
Hash如何存數據
hash表的本質其實就是數組,hash表中通常存放的是鍵值對Entry。
如下圖:
這裡的學號是個key,哈希表就是根據key值來通過哈希函數計算得到一個值,這個值就是下標值,用來確定這個Entry要存放在哈希表中哪個位置。
Hash碰撞
hash碰撞指的是,兩個不同的值(比如張三、李四的學號)經過hash計算後,得到的hash值相同,後來的李四要放到原來的張三的位置,但是數組的位置已經被張三占了,導致衝突。
解決方法
hash碰撞的解決方式是開放定址法和拉鏈法。
開放定址法指的是,當前數組位置1被占用了,就放到下一個位置2上去,如果2也被占用了,就繼續往下找,直到找到空位置。
拉鏈法採用的是鏈表的方式,這個時候位置1就不單單存放的是Entry了,此時的Entry還要額外保存一個next指針,指向數組外的另一個位置,將李四安排在這裡,張三那個Entry中的next指針就指向李四的這個位置,也就是保存的這個位置的記憶體地址。如果還有衝突,就把又衝突的那個Entry放到一個新位置上,然後李四的Entry指向它,這樣就形成一個鏈表。
總結起來:開放定址法和拉鏈法都是想辦法找到下一個空位置來存發生衝突的值。
更多 Java 教程:https://www.javastack.cn/java/
來源:blog.csdn.net/zsyoung/article/details/114505480
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
覺得不錯,別忘了隨手點贊+轉發哦!