一、Hash Map在日常開發中是常有用到的,面試也幾乎每次必問,詳細的HashMap講解還需查看專業博客,或查看原始碼,在此只是記錄日常開發遇到的問題和記錄使用;
1、HashMap的底層:
我們都知道JDK8的Hash Map的底層是陣列+鏈表+紅黑樹;那么,數字,鏈表,紅黑樹到底是怎么用的呢?
當通過 put(key,value),傳入一個新的鍵值對時,底層通過用 新增的 key 算出對應的 hash 值,再用這個 hash 值與陣列長度求模(陣列默認長度為16)
求得的結果即為該新鍵值對存放在陣列對應的陣列索引;
由于通過key算出的hash值可能相同,或者hash值和陣列長度求模后值相同,則表示會有多個鍵值對存放在陣列的同一個索引里面,此時就要用到鏈表結構,如下圖:
當使用 get(key)去獲取鍵值對時,也是先通過算Key的hash值,從而得到該key在陣列對應的索引值,
但是當該索引值下有多個通過鏈表存盤的鍵值對時,便需要遍歷該鏈表里面的所有key,直到找到與傳入的key相符的值
HashMap的key唯一,可以為null,但只能有一個為null,且如果存在為null的key一定為陣列的開頭處
當存入相同key的鍵值對,后者回覆寫前者的值
大家都知道,鏈表方便插入和洗掉資料,但查詢相當慢的,因此,在JDK8后,引入了紅黑樹的資料結構
紅黑樹資料結構具體實作自行去查找,有點長
鏈表長度超過閾值(8)時,將鏈表轉換為紅黑樹

2、面試常問
2.1、HashMap和HashTable的區別:
HashMap執行緒不安全,HashTable執行緒安全(但為了執行緒安全也不會用這個,一般使用ConcurrentHashMap),
HashMap可以允許key為null,HashTable不允許
2.2、使用HashMap需要注意什么:
HashMap的擴容是非常耗時間的,每次擴容為擴容前的兩倍,初始長度為16,如果大概知道所需長度的話,可以初始化長度,就不需要頻繁擴容了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243115.html
標籤:Java
