面試必考:HashMap的內部結構

HashMap的數據結構

    HashMap是一個很是有意思的結構, 它的整個結構是一個數組+鏈表的結構(當一個鏈表中的元素過多會從新調整成一個紅黑樹,這是1.7版本進行的一個改進)。java

    從字面上講,HashMap是一個map,就是一個映射性質的集合。它的一個主要功能是計算一個對象的hash值,而後經過這個hash值來直接尋找這個對象。算法

    經過映射的方式來查找對象,時間複雜度是O(1)。數組

HashMap是怎樣存儲數據的數據結構

    在進行建立一個HashMap的時候,若是沒有向構造函數傳遞一個Integer的參數,那麼這個HashMap的默認大小就是16,在源碼中的表現是以下:    函數

/**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    這個數字會在進行hash分組的時候會用到。spa

    當向HashMap中放入一個對象的時候,即執行put(key,value)的時候,先會對放入的key對象進行hash值的計算,在計算完成以後會獲得一個int的hash值,再經過這個hash值對這個HashMap的容量(以前有說,默認容量是16)進行求餘的操做,在java中是這樣進行的:code

(n - 1) & hash

    其中,n是HashMap的容量,這個操做等價於hash%n。在取到了這個餘數以後,就獲得了這個對象要放到數組的哪一個槽位裏。在肯定了放到哪一個槽位裏以後,會拿放入的value值與這個槽位裏全部的對象用equals方法進行比較:對象

    1.若是全部的對象都與value值不同,則把這個對象放到鏈表的最後 ci

    2.若是在遍歷的時候有對象與value相等,那麼就把傳入的對象替換它相同的對象源碼

    這樣的過程以後 ,就完成了對一個對象的放入。在這個過程當中,須要注意一點:由於是先按hash分組再按equals進行存放,因此兩個對象若是相等,就必定要放到數組的同一個槽位裏,若是不這樣作,就可能出現同一個對象出現兩次,而HashMap中的全部對象都是按照hash算法獲得hash值再處理的,因此沒有任何的順序可言,相同的對象是不能出現兩次的。因此有了如下的結論:

    兩個對象相等,就必定有相同的hash值,有相同hash值的對象不必定相等。這也是咱們重寫對象的hashCode()方法和equals()方法的時候須要注意的事項。

相關文章
相關標籤/搜索