java基礎之HashMap相關知識點

2021-09-24 17:02:40 字數 1467 閱讀 4575

1.hashmap是一種由陣列和鍊錶構成的資料結構,用於儲存「key-value對」元素,同時繼承了陣列的查詢優點和鍊錶的修改優點。

2.hashmap是非同步的,所以速度很快。並且鍵和值可以為null。

3.hashmap使用put(key,value)方法儲存物件到hashmap中,使用get(key)方法從hashmap中獲取物件。

4.hashmap資料結構具體為:首先是乙個定長的陣列,陣列儲存的物件是「key-value對」元素,陣列中的每個節點又分別是鍊錶的頭節點,比如有乙個大小為10的陣列,那麼鍊錶也有10個,這些鍊錶的頭節點構成了陣列。

5.hashmap儲存原理:(1)首先呼叫hashcode()方法對key計算得到hash值,該hash值代表在陣列中的儲存位置(陣列的下標)。(2)如果當前陣列位置還沒有儲存物件,就將該"key-value對"儲存進去,如果當前陣列位置已經有儲存的"key-value對"元素時,就發生了衝突,衝突的元素之間構成鍊錶,每次新的元素總是放在鍊錶的頭節點,也就是放在陣列當中,然後該鍊錶其他元素順延(相當於煉表頭插法,後來的元素總在最前面)。比如物件a計算的hash值為1,它應該儲存在陣列下標為1的位置,然後物件b計算的hash值也為1,但是此時陣列下標1已經儲存了a物件,於是它們之間通過鍊錶的形式連線起來,此時陣列下標為1的位置儲存b物件,而a物件通過鍊錶的形式連線在b物件的後面。同理如果有c物件和a和b發生衝突,,此時陣列下標為1的位置儲存c物件,b和a物件則在鍊錶中順延。

6.hashmap查詢原理:(1)首先通過hashcode()方法計算"key-value對"的key得到在陣列中的儲存位置,然後通過equals()方法得到"key-value對"在鍊錶中的儲存位置。

7.所謂hashmap衝突就是對不同的物件呼叫hashcode()方法計算key得到的hash值(也就是陣列下標)相同,這些衝突的物件通過鍊錶連線起來。

8.hashmap總結概括:hashmap由陣列和鍊錶組成,鍊錶的頭節點構成了陣列。hashmap儲存的物件是「key-value對」,而不僅僅是value。通過呼叫hashcode()方法對「key-value對」的key計算得到hash值(也就是陣列的下標),該hash值決定了物件在陣列中的儲存位置,如果不同的物件計算得到的hash值相同,就產生了衝突,,它們之間遵循頭插法原則,即最新的衝突物件放在陣列中,其他衝突物件在鍊錶中往後順延。

9.當hashmap中儲存的物件數目超過了負載因子(0.75),也就是說當hashmap容量已經超過了75%時,需要進行擴容,此時將會建立原來hashmap大小兩倍的新的hashmap,並將原來的物件放進新的hashmap中。

10.當鍊中長度超過了8時,將鍊錶轉為紅黑樹,當鍊表長度小於6時,將紅黑樹轉為鍊錶,這是為了提高查詢效率。

11.將儲存物件宣告為不可變的final物件,同時採用合適的equals()方法和hashcode()方法可以減少衝突的產生。

Java基礎之HashMap閱讀總結

工作中常常會遇到常用的類,但是由於封裝的太好,一般也不會出現太多的問題,就導致對底層的實現了解的比較少,最近想把這些東西全部都梳理一下,也順便多學習一些實現思路。歡迎共同 帶著幾個問題去讀原始碼 1.hashmap是基於哪種資料結構實現的?2.hashmap是如何儲存的?3.hashmap是如何取值...

java 集合學習之hashMap

1 hashmap類繼承關係 public class hashmapextends abstractmap implements map,cloneable,serializable 存放示意圖 由此可以看出hash值一樣的節點會被存放在同一條鍊錶上,比原始遍歷equals查詢效率高 hash值相...

java之HashMap和HashSet的遍歷方法

今天去面試,面試官問到這個問題,發現自己用了這麼久的hashmap和hashset,竟然只勉強想到了一種方法,總結一下 hashmap遍歷方法 1 使用entryset for map.entryentry map.entryset 2 使用entry的迭代器 iterator iterator m...