java hashmap 添加_JAVA—HashMap
一些關于hashmap的學習筆記
1.HashMap底層實現原理
在JDK1.7中HashMap是以數組加鏈表的形式組成的,在JDK1.8之后新增了紅黑樹的組成結構,當鏈表大于8并且容量大于64時,鏈表結構會轉變成紅黑樹結構。
數組中的元素稱為哈希桶,每個哈希桶有四個字段,hash、key、value以及表示下一個節點的next。
2.JDK1.8對HashMap的優化
(1)添加了紅黑樹,因為鏈表過長會影響HashMap的性能,降低效率,而紅黑樹具有快速增刪改查的特點,可以有效提高效率問題。
(2)死循環優化,鏈表插入方式改為尾部正序插入
(3)優化擴容,JDK1.8在擴容的時候選擇通過高位運算e.hash&olcCap來確定元素是否需要移動,而不是重新計算哈希值。
比如:
key1.hash=10 0000 1010
oldCap=16 0001 0000
高一位結果為0,0表示元素在擴容時位置不會發生變化
key2.hash=10 0001 0001
oldCap=16 0001 0000
這時候高一位為1,1表示元素在擴容時發生了位置變化,新的下標位置等于原下標位置+原數組長度
3.HashMap死循環
JDK1.7之前死循環造成的主要原因是HashMap并不是線程安全的并且在JDK1.8之前的插入方式為首部倒序插入。假設一個HashMap的默認大小為2,原本里面有個key(5),現創建兩個線程,t1向HashMap中添加元素key(3),t2添加元素key(7),t1在對next賦值后,t2得到cpu使用權,此時t1中e指向key(3),next指向key(7),之后t2重新rehash,鏈表順序被反轉,這時key(7)的next為key(3),之后查詢時久形成了循環調用,導致死循環。
總結
以上是生活随笔為你收集整理的java hashmap 添加_JAVA—HashMap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从sqlserver中数据写入mysql
- 下一篇: java接口有非抽象方法_如果一个类没有