在程式員這一職業中,集合是我們使用頻率相當高的一個工具,而其中的 HashMap,則更是我們用以處理業務邏輯的好幫手,同時 HashMap的底層實作和原理,也成了面試題中的常客,
下面我為大家總結了6道面試題,可以幫助你拿下99%的面試官沒問題

1. JDK8中的HashMap有哪些改動?
- JDK7中的底層實作是陣列+鏈表,JDK8中使用的是陣列+鏈表+紅黑樹,
- JDK7中擴容時有可能出現死鎖,JDK8中通過演算法優化不會出現死鎖了,
- JDK8中對算哈希值的哈希演算法進行了簡化以提高運算效率
2. JDK8中為什么要使用紅黑樹?
因為JDK7中是用陣列+鏈表來作為底層的資料結構的,但是如果資料量較多,或者hash演算法的散列性不夠,可能導致鏈表上的資料太多,導致鏈表過長,考慮一種極端情況:如果hash演算法很差,所有的元素都在同一個鏈表上,那么在查詢資料的時候的時間復雜度和鏈表查詢的時間復雜度差不多是一樣的,我們知道鏈表的一個優點是插入快,但是查詢慢,所以如果HashMap中出現了很長的鏈表結構會影響整個HashMap的查詢效率,我們使用HashMap時插入和查詢的效率是都要具備的,而紅黑樹的插入和查詢效率處于完全平衡二叉樹和鏈表之間,所以使用紅黑樹是比較合適的,
3. HashMap擴容機制是怎么樣的,JDK7 與JDK8有什么不同嗎?
首先,我們需要知道HashMap為什么需要擴容,道理很簡單,HashMap底層是用陣列+鏈表實作的,而陣列是預先就已經分配好記憶體的,如果需要對陣列進行擴容,需要重新開辟一個新的陣列再將舊陣列上的元素進行轉移,如果不進行擴容,那么會導致HashMap的鏈表過長,查詢效率降低,所以需要對陣列進行擴容,
在JDK7中,HashMap擴容的條件是 (size >= threshold) && (null !=table[bucketIndex]) , size 為HashMap當前的容量, threshold 初始化值為12, table[bucketIndex] 代表所put進來的key所對應的陣列上的元素,所以在JDK7中擴容條件是當當Put操操作傳入的 作傳入的Key值所對應的陣列位置上不為空時并且當前容量大于等于了擴容的閾值時才進行擴容 值所對應的陣列位置上不為空時并且當前容量大于等于了擴容的閾值時才進行擴容,JDK7中的擴容思路是:開辟一個新的陣列,陣列大小為原陣列的兩倍,然后再將陣列上的鏈表與元素轉移到新陣列上,此程序可能會出現死鎖,
JDK8中的擴容條件比JDK7中要少,只有當前容量大于等于了擴容的閾值時才進行擴容 當前容量大于等于了擴容的閾值時才進行擴容,并且擴容的思路也發生了變化,思路比較復雜,
4. 為什么重寫物件的Equals方法時,要重寫HashCode方法,跟HashMap有關系嗎?為什么?
跟HashMap有關系,或者說因為HashMap中用到了物件的hashcode方法所以會有關系,因為我們如果在設計兩個物件相等的邏輯時,如果只重寫Equals方法,那么一個類有兩個物件A1,A2,他們的A1.equals(A2)為true,A1.hashcode和A2.hashcode不一樣,當將A1和A2都作為HashMap的key時,HashMap會認為它兩不相等,因為
HashMap在判斷key值相不相等時會判斷key的hashcode是不是一樣,hashcode一樣相等,所以在這種場景下會出現我們認為這兩個物件相等,但是hashmap不這么認為,所以會有問題,
5. 在使用HashMap的程序中我們應該注意些什么問題?
-
HashMap的擴容機制是很影響效率的,所以如果事先能確定有多少個元素需要存盤,那么建議在初始化HashMap時對陣列的容量也進行初始化,防止擴容,
-
HashMap中使用了物件的hashcode方法,而且很關鍵,所以再重寫物件的equals時建議一定要重寫hashcode方法,
-
如果是用物件作為HashMap的key,那么請將物件設定為final,以防止物件被重新賦值,因為一旦重新賦值其實就代表了一個新物件作為了key,因為兩個物件的hashcode可能不同,
6. HashMap和Hashtable的區別
-
HashMap 是非執行緒安全的,HashTable 是執行緒安全的;HashTable 內部的方法基本都經過 synchronized修飾
-
因為執行緒安全的問題,HashMap 要比 HashTable 效率高一點,另外,HashTable 基本被淘汰,不要在代碼中使用它
-
HashMap 中,null 可以作為鍵,這樣的鍵只有一個,可以有一個或多個鍵所對應的值為 null,但是在HashTable 中 put 進的鍵值只要有一個 null,直接拋出 NullPointerException,
-
JDK1.8 以后的 HashMap 在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值(默認為8)時,將鏈表轉化為紅黑樹,以減少搜索時間,Hashtable 沒有這樣的機制,

最后
提莫在這里也還整理了一些平時自己學習的技術檔案與群友平時去面試的面試資料,
如果看完后對你有幫助,記得點贊支持一下哦!
Ps:有需要的小伙伴可以點擊直接進入:暗號:csdn,免費獲取,
面試專題檔案,

技術檔案

真實大廠面經

學海無涯,我們一起勉力前行
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/194348.html
標籤:其他
