hashmap集合:
1、hashmap集合底層是雜湊表/雜湊表的資料結構。
2、雜湊表是乙個怎樣的資料結構呢?
雜湊表是乙個陣列和單向鍊錶的結合體。
陣列:在查詢方面效率很高,隨機增刪方面效率很低。
單向鍊錶:在隨機增刪方面效率較高,在查詢方面效率很低。
雜湊表將以上的兩種資料結構融合在一起,充分發揮它們各自的優點。
3、hashmap集合底層的源**:
public class hashmap
}雜湊表/雜湊表:一維陣列,這個陣列中每乙個元素是乙個單向鍊錶。(陣列和鍊錶的結合體。)
4、最主要掌握的是:
map.put(k,v)
v = map.get(k)
以上這兩個方法的實現原理,是必須掌握的。
map.put(k,v)實現原理:
1.將k,v封裝到node物件中
2.底層呼叫k的hashcode()方法,得出hash值
3.通過 雜湊演算法/雜湊函式 將hash轉化為陣列下標,
若該下標位置上沒有元素,就把node新增到該位置上
若該下標位置上有鍊錶,此時會拿著k與鍊錶上的每乙個節點的k進行equals比較:
若比較結果都為false,則將新節點node新增到鍊錶末尾,
若有乙個節點的equals返回了true,則這個節點的value將被覆蓋
v=map.get(k)實現原理:
1.先呼叫k的hashcode()方法,得出hash值
2.通過 雜湊演算法/雜湊函式 將hash轉化為陣列下標,通過陣列下標快速定位到某個位置上,
若該下標位置上沒有元素,返回null
若該下標位置上有鍊錶,此時會拿著k與鍊錶上的每乙個節點的k進行equals比較:
若比較結果都為false,則返回null
若有乙個節點的equals返回了true,則返回這個節點的value
5、hashmap集合的key部分特點:
無序,不可重複。
為什麼無序? 因為不一定掛到哪個單向鍊錶上。
不可重複是怎麼保證的? equals方法來保證hashmap集合的key不可重複。
如果key重複了,value會覆蓋。
放在hashmap集合key部分的元素其實就是放到hashset集合中了。
所以hashset集合中的元素也需要同時重寫hashcode()+equals()方法。
6、雜湊表hashmap使用不當時無法發揮效能!
假設將所有的hashcode()方法返回值固定為某個值,那麼會導致底層雜湊表變成了
純單向鍊錶。這種情況我們成為:雜湊分布不均勻。
什麼是雜湊分布均勻?
假設有100個元素,10個單向鍊錶,那麼每個單向鍊錶上有10個節點,這是最好的,
是雜湊分布均勻的。
假設將所有的hashcode()方法返回值都設定為不一樣的值,可以嗎,有什麼問題?
不行,因為這樣的話導致底層雜湊表就成為一維陣列了,沒有鍊錶的概念了。
也是雜湊分布不均勻。
雜湊分布均勻需要你重寫hashcode()方法時有一定的技巧。
7、重點:放在hashmap集合key部分的元素,以及放在hashset集合中的元素,需要同時重寫hashcode和equals方法。
8、hashmap集合的預設初始化容量是16,預設載入因子是0.75
這個預設載入因子是當hashmap集合底層陣列的容量達到75%的時候,陣列開始擴容。
重點,記住:hashmap集合初始化容量必須是2的倍數,這也是官方推薦的,
這是因為達到雜湊均勻,為了提高hashmap集合的訪問效率,所必須的。
9、在jdk1.8之後,如果雜湊表單向鍊錶中元素超過8個,單向鍊錶這種資料結構會變成紅黑樹資料結構。
當紅黑樹上的節點數量小於6時,會重新把紅黑樹這種資料結構變成單向鍊錶。
這是為了提高檢索效率,二叉樹的檢索會再次縮小掃瞄範圍。提高效率。
HashMap深度解析
簡介 基於雜湊表的 map 介面的實現。此實現提供所有可選的對映操作,並允許使用 null 值和 null 鍵。除了非同步和允許使用 null 之外,hashmap 類與 hashtable 大致相同。此類不保證對映的順序,特別是它不保證該順序恆久不變。此實現假定雜湊函式將元素適當地分布在各桶之間,...
對hashMap的初步理解
當我們建立乙個hashmap,往hashmap裡面put元素的時候,hashmap內部會建立乙個陣列,陣列如果不指定初始容量,那麼hashmap在建立物件時,在第一次put元素的時候會預設指定乙個陣列的初始長度,為16位 static final int default initial capaci...
對HashMap的初步理解
一 hashmap 1 用來儲存key value鍵值對的一種結構 2 底層由陣列 鍊錶實現 二 hash和map的理解 1 雜湊hash 雜湊演算法也叫雜湊演算法,就是把任意長度值 key 通過雜湊演算法變換成固定長度的key位址,通過這個位址進行訪問的資料結構。它通過把關鍵碼值對映到表中乙個位置...