面試中的hashmap實現
hashmap是網際網路公司面試最頻繁的知識點之一,而很少問及list的的實現類,與因為list的實現過於簡單,所以掌握hashmap的原理會讓你在面試中獲得先機。
雜湊表(hash table)也叫雜湊表,是一種非常重要的資料結構,在通用的資料結構中,雜湊表的增刪改查速度是最快的,雜湊表儲存的是鍵值對,其查詢的時間複雜度和元素數量無關,雜湊表在查詢元素時是通過計算雜湊碼值來定位元素的位置從而直接訪問元素的,因此雜湊表查詢(不考慮雜湊衝突的情況下)的時間複雜度為o(1);應用場景:資料量較小;不需要預先知道資料規模;適應於頻繁的插入操作。
然而萬事無完美,如果兩個不同的元素,通過雜湊函式得出的實際儲存位址相同怎麼辦?也就是說,當我們對某個元素進行雜湊運算,得到乙個儲存位址,然後要進行插入的時候,發現已經被其他元素占用了,其實這就是所謂的雜湊衝突,也叫雜湊碰撞。前面我們提到過,雜湊函式的設計至關重要,好的雜湊函式會盡可能地保證 計算簡單和雜湊位址分布均勻,但是,我們需要清楚的是,陣列是一塊連續的固定長度的記憶體空間,再好的雜湊函式也不能保證得到的儲存位址絕對不發生衝突。那麼雜湊衝突如何解決呢?雜湊衝突的解決方案有多種:開放定址法(發生衝突,繼續尋找下一塊未被占用的儲存位址),再雜湊函式法,鏈位址法,而hashmap即是採用了鏈位址法,也就是陣列+鍊錶的方式。
hashmap的主幹是乙個entry陣列,每個entry的包含乙個鍵值對key-value;簡單來說,hashmap由陣列+鍊錶組成的,陣列是hashmap的主體,鍊錶則是主要為了解決雜湊衝突而存在的,如果定位到的陣列位置不含鍊錶(當前entry的next指向null),那麼對於查詢,新增等操作很快,僅需一次定址即可;如果定位到的陣列包含鍊錶,對於新增操作,其時間複雜度為o(n),首先遍歷鍊錶,存在即覆蓋,否則新增;對於查詢操作來講,仍需遍歷鍊錶,然後通過key物件的equals方法逐一比對查詢。所以,效能考慮,hashmap中的鍊錶出現越少,效能才會越好。
以下是具體的put過程(jdk1.8版)
1、對key求hash值,然後再計算下標
2、如果沒有碰撞,直接放入桶中(碰撞的意思是計算得到的hash值相同,需要放到同乙個bucket中)
3、如果碰撞了,以鍊錶的方式鏈結到後面
4、如果鍊錶長度超過閥值( treeify threshold==8),就把鍊錶轉成紅黑樹,鍊錶長度低於6,就把紅黑樹轉回鍊錶
5、如果節點已經存在就替換舊值
6、如果桶滿了(容量16*載入因子0.75),就需要 resize(擴容2倍後重排)
以下是具體get過程(考慮特殊情況如果兩個鍵的hashcode相同,你如何獲取值物件?)
當我們呼叫get()方法,hashmap會使用鍵物件的hashcode找到bucket位置,找到bucket位置之後,會呼叫keys.equals()方法去找到鍊錶中正確的節點,最終找到要找的值物件。
static final int hash(object key)
**>>>**無符號右移 無符號右移規則和右移運算是一樣的,只是填充時不管左邊的數字是正是負都用0來填充,無符號右移運算只針對負數計算,因為對於正數來說這種運算沒有意義
^位異或運算(^)
拉鍊法導致的鍊錶過深問題為什麼不用二叉查詢樹代替,而選擇紅黑樹?為什麼不一直使用紅黑樹?
之所以選擇紅黑樹是為了解決二叉查詢樹的缺陷,二叉查詢樹在特殊情況下會變成一條線性結構(這就跟原來使用鍊錶結構一樣了,造成很深的問題),遍歷查詢會非常慢。而紅黑樹在插入新資料後可能需要通過左旋,右旋、變色這些操作來保持平衡,引入紅黑樹就是為了查詢資料快,解決鍊錶查詢深度的問題,我們知道紅黑樹屬於平衡二叉樹,但是為了保持「平衡」是需要付出代價的,但是該代價所損耗的資源要比遍歷線性鍊錶要少,所以當長度大於***8***的時候,會使用紅黑樹,如果鍊錶長度很短的話,根本不需要引入紅黑樹,引入反而會慢。
如果hashmap的大小超過了負載因子(load factor)定義的容量,怎麼辦?
預設的負載因子大小為0.75,也就是說,當乙個map填滿了75%的bucket時候,和其它集合類(如arraylist等)一樣,將會建立原來hashmap大小的兩倍的bucket陣列,來重新調整map的大小,並將原來的物件放入新的bucket陣列中。這個過程叫作rehashing,因為它呼叫hash方法找到新的bucket位置。這個值只可能在兩個地方,乙個是原下標的位置,另一種是在下標為《原下標+原容量》的位置
吊打面試官 hashMap
hashmap 知識點 hashmap是什麼?hashmap是用來儲存key value鍵值對的集合類 它具有儲存效率高,查詢速度快的特點。hashmap的底層實現原理是什麼?hashmap底層是基於 陣列 鍊錶 紅黑樹 結構來實現的,陣列元素採用node節點來儲存key value鍵值對的資訊。h...
吊打面試官之HashMap
hashmap的底層資料結構是什麼?jdk1.7和jdk1.7前使用的是陣列,鍊錶 jdk1.8和jdk1.8後使用的是陣列,鍊錶,紅黑樹 hashmap的put方法流程是怎麼樣的?1.先獲取key的hash值 注意 通過key獲取hash值,直接獲取hash值就可以了,但是這裡把key的hash值...
關於面試官 1
不能問一些假設的問題,發現根本檢查不到任何想要的東西。因為只是假設性的 純理論性問題,基本上面試者都能構思出很完美的答案。例如 錯誤 如果你在編碼過程中,碰到技術問題,如何處理?推薦 你簡歷上的專案中,有沒有哪乙個在實現過程中,碰到了技術問題,詳細描述一下,後來怎麼解決的?錯誤 你對加班是如何看待的...