「金9銀10「面大廠,90%會被問到的HashMap問題!(含答案)

前言

正值金9銀10的黃金招聘期,大家都準備好了嗎?HashMap 是面試官必問的一個知識點,其內部的基本實現原理是每一位面試者都應該掌握的,只有真正地掌握了 HashMap 的內部實現原理,面對面試官的拷問,纔不會手忙腳亂。
近段時間正值找工做的最佳時間,本人將一些各大廠商的面試題和今年(2020)最新資料的收集,如下是部分資料截圖(全部資料均已整合成文檔,pdf壓縮打包處理)。
若有有須要的朋友能夠點擊這裏來獲取資料,暗號:qf

在這裏插入圖片描述web

面試題

1,HashMap底層存儲結構面試

HashMap在Jdk1.7的時候採用的是數組加鏈表的數據結構,jdk1.8以後採用了數組加鏈表加紅黑樹的數據結構。觀察源碼可知HashMap類中有一個很是重要的字段就是Node[] table,即哈希桶數組。而Node是HashMap的一個內部類,實現了Map.Entry接口,自己就是一個鍵值對。算法

2,解決Hash衝突的方法,HashMap採用了什麼方法解決Hash衝突?數組

HashMap使用哈希表來存儲數據的,固然哈希表不可避免的就會遇到hash衝突問題,解決hash衝突的方法大體有兩種:安全

1.開放地址法:當地址發生衝突時,按着某種方法繼續探測哈希表中的其餘存儲單元,直到找到空位置爲止。數據結構

2.鏈地址法:鏈地址法就是數組加鏈表的結合,在每個數組元素上都有一個鏈表結構,當地址發生衝突時就講數據存放在鏈表中。svg

而HashMap就是採用鏈地址法進行解決hash衝突的。性能

3,jdk1.8的HashMap中的鏈表達到多少個時會生成紅黑樹?大數據

HashMap用鏈地址法解決hash衝突,則當鏈表裏的長度太長就會嚴重影響HashMap的性能。因而在jdk1.8裏,對數據結構作了進一步優化,引入了紅黑樹,當鏈表長度大於8的時候,鏈表就會轉成紅黑樹,利用紅黑樹快速增刪改查的特色提升HashMap的性能,其中會用到紅黑樹的插入、刪除、查找等算法。
在這裏插入圖片描述
4,HashMap初始值的大小和負載因子的大小?優化

hashMap初始長度就是16,負載因子是0.75。HashMap所容納的最大數據量爲:長度*負載因子。即當長度達到這個值的時候就會發生擴容。

5,HashMap擴容機制

擴容(resize)就是從新計算容量,向HashMap對象裏不停的添加元素,而HashMap對象內部的數組沒法裝載更多的元素時,對象就須要擴大數組的長度,以便能裝入更多的元素。固然Java裏的數組是沒法自動擴容的,方法是使用一個新的數組代替已有的容量小的數組,就像咱們用一個小桶裝水,若是想裝更多的水,就得換大水桶。底層是resize方法中的transfer方法將原有的Entry數組的元素拷貝到新的Entry數組裏,擴容都是以2的N次冪進行擴容 通常是2倍。

6,HashMap線程安全問題 HashTable ConcurrentHashMap

HashMap是線程不安全的,多個線程同時寫HashMap可能會致使數據的不一致。若是須要知足線程安全能夠用ConcurrentHashMap,還有一個HashTable。可是HashTable是繼承自Dictionary類,HashTable容器使用synchronized來保證線程安全,但在線程競爭激烈的狀況下,HashTable的效率很是低下,ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成,採用segment分段鎖來保證線程安全。

HashTable不管key或value都不能爲null,HashMap只能容許一個key爲null,能夠運行多個value爲null。並且HashTable是線程安全的,HashMap是線程不安全的。

7,HashMap鏈表成環

因爲HashMap線程不安全的,至於爲什麼不安全,何時會出現問題,這裏來討論一下:

當有多個線程共同操做hashMap的put方法時,這個時候hashMap容量不夠了,兩個線程都去擴容執行resize方法,在這個時候cpu切換資源的話,會形成鏈表成環問題,死循環問題。

題外

到此這篇關於HashMap面試題彙總(附答案)的文章就介紹到這了
若有有須要的朋友能夠點擊這裏來獲取資料,暗號:qf**
在這裏插入圖片描述