成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HashMap面試怎么面?

開發 前端
HashMap是java面試的時候最常問的問題,其中牽扯的知識點很多,很適合考察面試的基礎,我反正面試很多家這個問題確實是必問,不準備一番還真不好回答好。
本文轉載自微信公眾號「Java時間屋」,作者Jack佳。轉載本文請聯系Java時間屋公眾號。
  • 1.HashMap的數據結構:
  • 2.HashMap的hash函數設計:
  • 3.Java1.8的Java1.7對比:
    • 3.1 擾動的次數減少:
    • 3.2 結構變化:
    • 3.3 插入變化:
    • 3.4 擴容的變化:
    • 3.5 擴容的時間變化:
  • 4.HashTable和Collections.synchronizedMap、以及ConcurrentHashMap可以實現線程安全的Map原理:
  • 5.Map集合的順序:

前言

HashMap是java面試的時候最常問的問題,其中牽扯的知識點很多,很適合考察面試的基礎,我反正面試很多家這個問題確實是必問,不準備一番還真不好回答好。

1.HashMap的數據結構:

JDK1.8:數組+鏈表/紅黑樹 數據結構原理:鏈表長度>8&數組大小>=64=》轉為紅黑樹存儲;紅黑樹節點個數<6轉為鏈表。tips:為什么不是小于8是為了防止頻繁的結構轉換增加開銷。那為啥是8呢?發生hash碰撞的幾率8次的概率為百萬分之6,夠了。HashMap的數據插入原理:

重點說明:上面計算數組位置的方法是:通過 (n - 1) & hash計算應當存放在數組中的下標 index ;叫做位運算為啥(n-1)更接近于取模,為啥采用位運算是因為效率高,不存在二進制和十進制的轉換。這里在補充一點HashMap初始化數組大小的問題,HashMap數組初始化大小為16,為啥呢?理論上來說2的整數次冪都可以,但是如果是2,4或者8就會有點小,添加不了多少數據就會擴容,影響性能,如果是32或者更大,就會浪費空間。所以16是一個經驗值保留下來的。

2.HashMap的hash函數設計:

在HashMap中,首先是通過key的hashcode(32位的int值)然后讓hashcode的高16位和低16位進行異或操作。為啥這樣設計:1.上面的hash函數也叫擾動函數,主要考慮盡可能降低hash碰撞,越分散越好。

2.算法一定要盡可能的高效,因為這是高頻操作,因此采用位運算。

3.因為hashcode的范圍是int類型,大概40億的映射空間,如果只是hashcode,很少會出現碰撞,但是數組和內存是發放不下的,初始大小才16的數組只能進行取模運算/位運算來達到目的。

HashMap的數組長度要取2的整數冪,這樣數組長度-1剛好"低位掩碼",加上hash函數(擾動函數)降低碰撞。

3.Java1.8的Java1.7對比:

3.1 擾動的次數減少:

java1.8跟java1.7在這里的區別就hash函數里面是java8只擾動了一次,為了效率。java7在這里擾動了四次。

3.2 結構變化:

1.7里面的數組+鏈表===》數組+鏈表或紅黑樹。為什么這樣做,前者的查詢效率是n后者的查詢效率是log2(n),所有當鏈表數據量大的時候會有效率問題。

3.3 插入變化:

鏈表的插入方式從頭插法改成了尾插法,簡單來說就是1.7中是往前面插入,1.8中是往后插入,這樣做的目的是為了防止擴容的時候死循環。

3.4 擴容的變化:

擴容的時候1.7是重新hash定位新數組的位置,1.8則是采用更簡單的邏輯判斷,位置不變或索引+舊容量大小。為什么1.8能這樣,計算數組的位置的掩碼僅僅只是高位多了一個1。

3.5 擴容的時間變化:

在插入時,1.7先判斷是否需要擴容再插入,1.8是插入以后再判斷是不是需要擴容

4.HashTable和Collections.synchronizedMap、以及ConcurrentHashMap可以實現線程安全的Map原理:

我們都知道的是HashMap是線程不安全的,1.7版本的時候會產生死循環、數據丟失、數據覆蓋的問題,1.8中解決了其中的兩個問題,仍然會有數據覆蓋的問題,就是多線程并發操作下的值覆蓋。如果業務場景中需要線程安全,就要使用線程安全的Map類,一般我們使用的是ConcurrentHashMap。

ConcurrentHashMap:使用的分段鎖,降低鎖粒度,提高并發度和效率。1.8相對1.7也是提升了效率,成員變量之間使用了volatile修飾,避免了指令重排,保持內存可見。采用的CAS和synchronized結合實現賦值操作,只會鎖住當前操作索引節點。

HashTable:直接在操作方法上synchronized關鍵字,鎖住整個數組,效率會很低。SynchronizedMap:內部實現的對象鎖實現。效率比HashTable會高點。

5.Map集合的順序:

HashMap里面是無序的,所以只能循環遍歷。LinkedHashMap:有序map,內部維護了一個單鏈表。單鏈表的before和after使其具有了有序的特性。TreeMap:內部通過Comprator比較器實現了排序。

總結

我上面的論述也是參考的網上我認為不錯的針對HashMap的講解,然后加入了我自己的理解,讓大家能夠更好的理解其中的原理內容,如果你有其他問題,歡迎關注我的公眾號:Java時間屋 進行討論。

 

責任編輯:武曉燕 來源: Java時間屋
相關推薦

2023-09-12 11:00:38

HashMap哈希沖突

2022-03-28 12:00:57

HashMap容量hash

2025-05-27 10:15:00

void*函數開發

2024-05-24 10:15:36

2024-09-04 15:17:23

2020-04-28 09:15:58

HashMapJava數組

2022-01-20 08:44:25

HashMap死循環開放性

2022-08-29 07:31:48

HashMap線程擴容

2022-01-18 06:59:50

HashMap循環底層

2015-09-07 09:15:54

Java面試題HashMap

2020-09-29 15:24:07

面試數據結構Hashmap

2020-06-19 15:32:56

HashMap面試代碼

2020-10-21 07:50:52

HashMapJava數組

2020-12-03 07:39:50

HashMap底層數據

2022-05-27 08:18:00

HashMapHash哈希表

2021-12-08 06:53:28

HashMap面試JDK 8

2022-09-13 14:44:40

HashMap哈希表紅黑樹

2023-02-17 14:35:15

HashMapNode類型

2024-11-05 09:28:52

2020-05-13 14:35:47

HashMap面試官Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级黄片一级毛片 | 成人免费高清 | 久久99精品久久久久久秒播九色 | 亚洲精品视频在线观看免费 | jlzzjlzz国产精品久久 | 久久久久av | 青春草91 | 欧美xxxx黑人又粗又长 | 亚洲成人精品在线观看 | 欧美一级欧美一级在线播放 | 久久久久久久亚洲精品 | 亚洲淫视频 | 免费国产视频在线观看 | 国产日韩精品在线 | 亚洲人人 | 男人天堂网av | 成人精品久久日伦片大全免费 | 国产亚洲精品精品国产亚洲综合 | 看特级黄色片 | 国产成人久久精品一区二区三区 | 欧美日韩综合精品 | 精品中文字幕视频 | 成人免费精品视频 | 一级片免费视频 | 日本精品999 | 男女视频在线免费观看 | 天天干天天爱天天爽 | 中文字幕在线播放第一页 | 日本黄视频在线观看 | 九九综合九九 | 玖玖色在线视频 | 国产精品久久久久久久久久 | 爱操av| 亚洲精品福利在线 | 欧美激情欧美激情在线五月 | 精品视频国产 | 91麻豆精品国产91久久久更新资源速度超快 | 日韩一区二区三区四区五区 | 久久精品亚洲 | 国产精品精品视频一区二区三区 | 亚洲欧美日韩一区二区 |