HashMap底層資料結構原始碼解析

我是壞人哦發表於2020-09-23

HashMap應該是每個Java程式設計師日常開發都很熟悉的集合型別,使用也很簡單,不贅述。

import java.util.HashMap;

public class HashMapTest {
    public static void main(String[] args) {
        HashMap<Integer,String> user = new HashMap<>();
        //往HashMap裡面存放資料
        user.put(1,"張三");
        user.put(2,"李四");
        user.put(3,"王五");
        
        //從HashMap裡面取資料
        String name = user.get(1);

        System.out.println(name);
    }
}

我們點進put方法裡面看看HashMap都做了啥。

這裡有兩點需要關注的,一個是HashMap的put方法原來是有返回值的(雖然在生產開發中我從來沒有用過hhh) 。上面的註解告訴我們,返回值是key關聯的前一個值,怎麼理解呢?於是我寫了一個測試程式碼測了一下。

import java.util.HashMap;

public class HashMapTest {
    public static void main(String[] args) {
        HashMap<Integer,String> user = new HashMap<>();
        //往HashMap裡面存放資料
        System.out.println(user.put(1, "張三"));
        System.out.println(user.put(1, "李四"));
        System.out.println(user.put(1, "王五"));
        
        System.out.println(user.get(1));
    }
}

輸出結果: 

null
張三
李四
王五

我們put了三個同樣的key,第一次輸出結果是null,第二次輸出的是第一次put進去的value,第三次輸出第二次put進去的value。結論:如果put進去的key跟HashMap原有的Key發生重複,那麼對應的值會被替換,被替換的值會在返回值中返回。

第二個關注點是hash(key)這個方法。這裡是一個三目運算子,如果key為null返回0,否則返回(key的雜湊值h) XOR (h邏輯右移16位)。Java中的<< 和 >> 和 >>> 詳細分析

那麼來看看key的hash演算法是怎麼算的吧~然後一臉期待地點進去發現,我**都**了,你就給我看這個??

 

所以這個演算法估計是在更底層實現的,已經不是java這層關心的事情的,那就先跳過吧,知道這裡是個雜湊演算法就行了。然後我們回過頭來看看key的雜湊值有了,那麼怎麼把value的值放到HashMap裡面呢?點進putVal()裡面:

 

到這裡就能先畫個圖了,首先這是個陣列tab,然後陣列tab裡面裝的Node是連結串列。就這醬紫啦!

 

【未完待續...】 

相關文章