HashMap在jdk7和jdk8中的實現原理

2022-10-06 18:54:09 字數 986 閱讀 7749

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

JDK7和JDK8中HashMap版本有什麼不同?

hashmap底層是陣列,稱為雜湊桶,儲存結構 jdk7是陣列 鍊錶,jdk8 是陣列 鍊錶 紅黑樹。1 鍊錶插入方式的不同 在1.7之前,鍊錶元素的插入採用的是頭插法,也就是說,當有新結點進來時,會在插入在鍊錶的頭部。很明顯,由於不用遍歷鍊錶,這種插入方式的效率是更高的。但是1.8之後,因為當結點...

JDK7中HashMap的解析(未完)

1 hashmap採用的是資料 鍊錶的儲存結構 2 初始化預設長度為16,每次擴容 2,負載因子預設0.75 3 擴容核心類 void transfer entry newtable,boolean rehash int i indexfor e.hash,newcapacity e.next ne...

JDK7與JDK8中HashMap的實現的區別

hashmap底層維護乙個陣列,陣列中的每一項都是乙個entry transient entry table 我們向 hashmap 中所放置的物件實際上是儲存在該陣列當中 而map中的key,value則以entry的形式存放在陣列中 static class entryimplements ma...