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...