中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有哪些HashMap面試專題

發布時間:2021-10-25 16:38:12 來源:億速云 閱讀:150 作者:iii 欄目:編程語言

這篇文章主要介紹“有哪些HashMap面試專題”,在日常操作中,相信很多人在有哪些HashMap面試專題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”有哪些HashMap面試專題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、Hash的概念 

將任意長度的輸入通過散列算法之后映射成固定長度的輸出。

2、Hash沖突 

當關鍵字集合很大時(key的數量很多的時候),關鍵字值不同的元素可能會映像到哈希表的同一地址上,即K1!=K2,但f(K1)=f(K2),這種現象稱為hash沖突,實際中沖突是不可避免的,只能通過改進哈希函數的性能來減少沖突。

3、你認為好的Hash算法的點應該有哪些? 

(1)效率得高,做到長文本也能高效計算出Hash值

(2)根據Hash值不能逆推出原文

(3)兩次輸入,如果有一點不同也得保證Hash值是不同的

(4)盡可能要分散,因為在table中slot大部分都處于空閑狀態時要盡可能降低Hash沖突

4、HashMap的存儲結構長啥樣?

JDK1.8:

(1)數組+鏈表+紅黑樹構成,每個數據單元為一個Node結構,Node結構中有key字段、value字段、next字段、hash字段
(2)next字段就是發生Hash沖突的時候,當前桶位中的Node與沖突Node連接成一個鏈表所需要的字段
有哪些HashMap面試專題
有哪些HashMap面試專題JDK1.7:

數組+鏈表

45、如果創建HashMap的時候沒有指定HashMap散列表的長度,初始長度為多少?

在JDK 8中,關于默認容量的定義為:static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //16 ,其故意把16寫成1<<4,就是提醒開發者,這個地方要是2的冪。

(1)為啥用位運算呢?直接寫16不好么?
這樣是為了位運算的方便,位與運算比算數計算的效率高了很多,之所以選擇16,是為了服務將Key映射到index的算法。

(2)那為啥用16不用別的呢?
因為在使用不是2的冪的數字的時候,Length-1的值是所有二進制位全為1,這種情況下,index的結果等同于HashCode后幾位的值。這個值既不能太小,也不能太大。
太小了就有可能頻繁發生擴容,影響效率,太大了又浪費空間,不劃算。

只要輸入的HashCode本身分布均勻,Hash算法的結果就是均勻的。

這是為了實現均勻分布。

6、散列表是New HashMap()的時候創建的,還是什么時候創建的?

散列表是懶加載機制,只有在第一次put數據的時候才創建(JDK1.8,JDK1.7是直接加載散列表)

7、負載因子默認是多少,有啥作用?為什么負載因子為0.75?什么時候進行擴容(resize)?

(1)默認為0.75,用于計算擴容閾值
(2)loadFactor是負載因子,表示HashMap滿的程度,默認值為0.75f,設置成0.75有一個好處,那就是0.75正好是3/4,而capacity又是2的冪。所以,兩個數的乘積都是整數。
(3)影響擴容主要有兩個因素:
??Capacity:HashMap當前長度。
??LoadFactor:負載因子,默認值0.75f。
??怎么理解呢,就比如當前的容量大小為100,當你存進第76個的時候,判斷發現大于擴容閾值100*0.75=75需要進行resize了,那就進行擴容,但是HashMap的擴容也不是簡單的擴大點容量這么簡單的。

8、擴容?它是怎么擴容的呢?

分為兩步

(1)擴容:創建一個新的Entry空數組,長度是原數組的2倍。

(2)ReHash:遍歷原Entry數組,把所有的Entry重新Hash到新數組。

為什么要重新Hash呢,直接復制過去不香么?

是因為長度擴大以后,Hash的規則也隨之改變。
有哪些HashMap面試專題
比如原來長度(Length)是8你位運算出來的值是2 ,新的長度是16你位運算出來的值明顯不一樣了。

9、鏈表轉化為紅黑樹的條件

(1)鏈表長度達到8
(2)當前散列表長度達到64
以上兩個條件同時滿足鏈表才會轉化為紅黑樹,如果僅僅鏈表長度達到8,它不會發生鏈表轉紅黑樹,只會發生一次散列表擴容(resize)

10、Node對象里面的hash字段的值是key對象的hashcode的返回值嗎?

不是的,通過key的hashcode的高16位異或低16位得到的新值,這樣即使數組table的length比較小的時候,也能保證高低bit都參與到Hash的計算中,避免高16位浪費沒起到作用,盡可能的得到一個均勻分布的hash。

11、為啥我們重寫equals方法的時候需要重寫hashCode方法呢?你能用HashMap給我舉個例子么?

因為在java中,所有的對象都是繼承于Object類。Ojbect類中有兩個方法equals、hashCode,這兩個方法都是用來比較兩個對象是否相等的。

在未重寫equals方法我們是繼承了object的equals方法,那里的 equals是比較兩個對象的內存地址,顯然我們new了2個對象內存地址肯定不一樣

比如發生Hash沖突的時候,我們去get,他就是根據key去hash然后計算出index,找到了2,那我怎么找到具體的”電腦“還是”腦電“呢?

equals!是的,所以如果我們對equals方法進行了重寫,建議一定要對hashCode方法重寫,以保證相同的對象返回相同的hash值,不同的對象返回不同的hash值。

12、HashMap的put數據的流程

有哪些HashMap面試專題

13、為什么java8以后鏈表數據超過8以后,就改成紅黑樹存儲?

這就涉及到拒接服務攻擊了,比如某些人通過找到你的hash碰撞值,來讓你的HashMap不斷地產生碰撞,那么相同key位置的鏈表就會不斷增長,當你需要對這個HashMap的相應位置進行查詢的時候,就會去循環遍歷這個超級大的鏈表,性能及其地下。java8使用紅黑樹來替代超過8個節點數的鏈表后,查詢方式性能得到了很好的提升,從原來的是O(n)到O(logn),容器中節點分布在hash桶中的頻率遵循泊松分布,桶的長度超過8的概率非常非常小(約為10萬分之一),所以作者應該是根據概率統計而選擇了8作為閥值。

14、Hashmap的結構,1.7和1.8有哪些區別?

(1)JDK1.7用的是頭插法,而JDK1.8及之后使用的都是尾插法,那么他們為什么要這樣做呢?
因為JDK1.7是用單鏈表進行的縱向延伸,當采用頭插法時會容易出現逆序且環形鏈表死循環問題。但是在JDK1.8之后是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鏈表死循環的問題。

(2)擴容后數據存儲位置的計算方式也不一樣:1. 在JDK1.7的時候是直接用hash值和需要擴容的二進制數進行&(這里就是為什么擴容的時候為啥一定必須是2的多少次冪的原因所在,因為如果只有2的n次冪的情況時最后一位二進制數才一定是1,這樣能最大程度減少hash碰撞)(hash值 & length-1)

15、首先HashMap是線程不安全的,其主要體現在哪里?

(1)在jdk1.7中,在多線程環境下,擴容時會造成環形鏈或數據丟失。

(2)在jdk1.8中,在多線程環境下,會發生數據覆蓋的情況。

到此,關于“有哪些HashMap面試專題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節
推薦閱讀:
  1. MongoDB專題
  2. 緩存專題

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建始县| 镇远县| 栾川县| 福泉市| 安多县| 兰考县| 额济纳旗| 漳州市| 九龙城区| 武山县| 北碚区| 德兴市| 永平县| 新沂市| 名山县| 庆阳市| 巨鹿县| 蚌埠市| 定南县| 岑溪市| 台湾省| 洛川县| 开江县| 华容县| 湘潭县| 七台河市| 益阳市| 颍上县| 祁东县| 镇雄县| 景谷| 龙胜| 广州市| 白朗县| 界首市| 文成县| 芮城县| 上虞市| 永德县| 香河县| 南康市|