HashMap的底層原理

2021-08-30 17:37:15 字數 684 閱讀 6445

在jdk1.6和jdk1.7中hashmap是桶加鍊表的實現方式.hashmap的底層結構就是乙個陣列,陣列中每乙個元素又是乙個鍊錶.當新增乙個元素(key-value)的時候,根據key的hash值(或者說呼叫key的hashcode方法)來確定插入到哪乙個桶中(確定插入陣列中的位置),當桶中有多個key元素時,使用鍊錶進行儲存,這代表發生了雜湊碼的碰撞,這時判斷同乙個桶中的元素是否相同就需要呼叫equals方法進行判斷,其實hashmap很少用到equals方法,equals方法只要在雜湊碼碰撞的時候才會使用的方法. 當乙個桶中存放的資料過多,那麼根據key查詢的效率就會降低

hashmap通過hashcode和equals最終判斷出k是否已存在,如果已存在,則使用新v值替換舊v值,並返回舊v值,如果不存在 ,則存放新的鍵值對到bucketindex位置

為了解決這個問題

當陣列的容量超過初始容量(預設為16)的0.75(負載因子)時,將陣列中的長度擴大為原來的2倍(也就是通常所說的rehash操作),由於容量發生變化,原有的每個元素需要重新計算bucketindex,再存放到新陣列中去(hashmap原始碼中的resize),雖然擴容比較耗時,但是擴容一次後很久就不用再擴容

在jdk1.8中,hashmap採用桶+鍊錶+紅黑樹實現,當鍊表的長度超過8時,將鍊錶轉化為紅黑樹(紅黑樹的查詢時復是o(lgn),而鍊錶的查詢時間複雜度是o(n))

HashMap底層原理

1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...

HashMap底層原理

hashmap實現map介面,非執行緒安全的,區別於concurrenthashmap。允許使用null值和null鍵,不保證對映的順序.底層資料結構是乙個 陣列 鍊錶 紅黑樹 put 根據key計算得到key.hash h k.hashcode h 16 根據key.hash計算得到桶陣列的索引i...

HashMap底層原理

預設負載因子 static final float default load factor 0.75f 無參構造 public hashmap 有參構造 public hashmap int initialcapacity public hashmap int initialcapacity,flo...