1. 程式人生 > >HashMap實現原理詳解

HashMap實現原理詳解

  1. HashMap定義
    HashMap實現了Map介面,一種將鍵對映到值得物件。
    一個對映不能包含重複的鍵;每個鍵只能對映到一個值上。
    HashMap的元素是無序的。要實現有序排列必須實現hashcode()方法和equals()方法。

  2. HashMap的繼承關係。

public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

HashMap繼承了AbstractMap,實現了Map介面。

  1. HashMap的實現原理

    1.HashMap的存放採用線性表的儲存方式。
    線性表的大小會根據你給出的大小,由系統自動分配給你響應的空間。
    實際上分配的是2的次方大小。(例如:你給了5個值,系統會自動分配給你2的3次方也就是8)
    2.每個值存放的是鍵值對,也就是Entry

static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        int hash;
}

用圖解釋他的存放原理。
1. HashMap存放的是鍵值對。也就是Entry。 其中key和value分別對應了其中的鍵和值。next存放的是下一個的地址。其中hash是由key進過hashcode()方法進行計算,得到的hash值。
2. 然後再進行雜湊計算。雜湊計算大體上來說就是進行求餘計算。根據系統分配的大小。用這個大小進行求餘計算,然後根據求餘結果存放到相應的位置。然後進行equals方法進行判斷。如果沒有值和他相等。就放在整個連結串列的首部位置。
3.其中,有一個載入因子的問題。也就是說,沒次系統分配記憶體大小時。都會根據2的幾次方再乘以載入因子的大小。取值為0<=p<=1.
每次當線性表填滿時。他會進行擴容。也就是乘以2。這是記憶體大小發生變化,就會進行reHash操作。然後重新分配相應的位置。載入因子的大小最好為0.75。
這裡寫圖片描述