jdk1 7與jdk1 8的HashMap區別詳解

2022-06-14 14:30:15 字數 1003 閱讀 4141

首先我們來談談hashmap,從字面上來看,hashmap的名字中帶有hash,我們就可以聯想到hashmap的儲存方式可能與hash有關。

下面我們來談談hashmap的儲存機制:

hashmap是以鍵值對的形式儲存資料的,其底層儲存是以陣列+鍊錶的方式實現的(jdk1.8之後又引入了紅黑樹)。

首先我們可想象乙個陣列,這個陣列的預設大小是16(因為在建立乙個hashmap物件時,如果不指定其長度,那麼底層將會預設建立乙個有16個大小的陣列)。

hashmap在存入乙個資料時,會先去呼叫物件的hashcode方法計算出該物件應該放在之前建立的陣列的哪個位置(即陣列的索引值),若該位置為空,則直接將該物件存進去,若該位置有值,在去呼叫物件的equals方法比較兩個key的值是否相等,如果相等則覆蓋掉value的值,如果不相等,則在陣列該索引處將舊值後移並將新值插入,形成乙個鍊錶(這是jdk1.7及以前的方式)。

上述方式存在乙個問題,即如果多次新增資料的位置相同的話,那麼這個鍊錶就會一直增長,而且每次在鍊錶中新增資料時都要移動鍊錶中的資料,這樣情況稱之為碰撞。我們需要儘量減少這種碰撞的發生,發生碰撞,可能會增長鍊錶,鍊錶增長越長,碰撞的所需的時間就越多,可想是多麼影響效率。

所以hashmap就引入了載入因子避免碰撞,預設為0.75,即當元素達到現有hash表的75%時擴容,一旦擴容將會重新排序hash表,減少碰撞的概率。

jdk1.8之後:

上述情況依舊不能避免形成一長串鍊錶的可能,所以在jdk1.8之後引入了紅黑樹。開始的儲存方式與之前相同,通過key確定存放位置,通過value判斷是否覆蓋或新增鍊錶,超過閾值0.75自動擴容,但是改變的是如果鍊錶的長度大於8,那麼就會將鍊錶轉化為紅黑樹,但是在轉變成樹之前還會有乙個判斷,只有鍵值對的數量大於64才會發生轉換。這是為了避免在雜湊表建立初期,多個鍵值對恰好被放入了同乙個鍊錶中而導致的不必要的轉化。

關於 JDK1 7 和 JDK1 8 的區別

jdk1.8 在 jdk1.7的基礎上新增了如下功能 1 default關鍵字 實現的介面中如果有 default 修飾的方法,實現類可以不重寫此方法 2 lambda 表示式,函式式程式設計,函式式程式設計就是一種抽象程度很高的程式設計正規化,對一些只使用一次的介面的編碼進行了優化 3 函式式介面...

JDK1 8中的hashmap和JDK1 7的區別

1.資料插入的方式不同 jdk1.7用的是頭插法,而jdk1.8用的是尾插法,這是由於jdk1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鍊錶死迴圈問題。但是在jdk1.8之後是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鍊錶死迴圈的問題。2.組成結構不同 jdk1.7的時候使...

JDK1 7和JDK1 8HashMap的區別

jdk1.7與jdk1.8中hashmap區別 最重要的一點是底層結構不一樣,1.7是陣列 鍊錶,1.8則是陣列 鍊錶 紅黑樹結構 jdk1.7中當雜湊表為空時,會先呼叫inflatetable 初始化乙個陣列 而1.8則是直接呼叫resize 擴容 插入鍵值對的put方法的區別,1.8中會將節點插...