1. 程式人生 > 其它 >HashMap在jdk7和jdk8中的實現原理

HashMap在jdk7和jdk8中的實現原理

HashMap在jdk7中實現原理:

  HashMap map = new HashMap<>();

  1.在例項化以後,底層建立了一個長度為16的一維陣列Entry[] table

   2. 在可能執行多次put後 map.put(key1,value1)

  首先,呼叫key1所在類的hashcode()計算出key1的雜湊值,此雜湊值經過某種演算法計算後,得到Entry陣列中的存放位置。

  如果在此位置上的資料為空,此時key1-value1新增成功, --情況1

  如果此位置上的資料不為空,意味著此位置上存在一個或多個數據(以連結串列形式存在),比較key1和已存在的一個或者多個數據的雜湊值:

    如果key1的雜湊值與已經存在的資料的雜湊值不相同,此時key1-value1新增成功 --情況2

    如果key1的雜湊值和已經存在的某個資料(key2-value2)的雜湊值相同,此時比較:呼叫key1所在類的equals(key2)方法:

      如果equals()返回false:此時key1-value1新增成功。

      如果equals()返回true:此時value1替換value2.

    補充:關於情況2和情況3:此時key1-value1和原來的資料以連結串列方式儲存。

    在不斷新增的過程中會涉及擴容的問題,預設的擴容方式:擴容為原來容量的2倍,並原來的資料複製過來。

HashMap在jdk8中實現原理:

  相較於jdk7,底層實現原理:

  1、 new hashMap():底層沒有建立一個長度為16的資料組;

  2、jdk8底層的陣列是node[] ,而非是Entry[]

  3、首次呼叫put()方法時,底層建立長度為16的陣列

  4、jdk7底層只有:陣列+連結串列, jdk8中的底層:陣列+連結串列+紅黑樹

    當陣列的某一個索引位置上元素以連結串列形式存在的資料個數>8且當前陣列長度>64時,此索引位置上的所有資料改為使用紅黑樹儲存。