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時,此索引位置上的所有資料改為使用紅黑樹儲存。