java集合中的常見考點

小樓昨夜又西風發表於2019-03-02

1.講一下集合中的 fail-fast 機制 ?

解釋: 主要就是在iterater集合迭代的過程中發生集合的結構遭到破壞的情況下,系統丟擲異常的過程

參考連結:https://blog.csdn.net/zymx14/article/details/78394464
fail-fast的簡介:
fail-fast 機制,即快速失敗機制,是java集合(Collection)中的一種錯誤檢測機制。當在迭代集合的過程中該集合在結構上發生改變的時候,就有可能會發生fail-fast,即丟擲ConcurrentModificationException異常。 fail-fast機制並不保證在不同步的修改下一定會丟擲異常,它只是盡最大努力去丟擲,所以這種機制一般僅用於檢測bug。
在這裡插入圖片描述

2. java集合類

在這裡插入圖片描述

3.hashMap底層原理

在這裡插入圖片描述
在這裡插入圖片描述
解釋: 要知道entry裡面有4個屬性,key,value,hashcode,next(指向下一個entry的指標)
在這裡插入圖片描述
在這裡插入圖片描述
hashMap是2的整數次冪的原因可以參考下述連結來看:
https://blog.csdn.net/qq_40241957/article/details/84995597

問題一:hashMap為什麼會在併發訪問的時候形成閉環,從而get()操作的時候形成死環?
解釋:主要是在hashMap擴容的那個時候,這個時候多個執行緒同時執行rehash操作,那麼就有可能發生閉環,見下面參考連結
參考連結:https://blog.csdn.net/hll174/article/details/50915346
閉環以後形成死環的原因: get()操作本來就是在找到一個table[i]之後,也就是我們說的“桶”,然後逐個遍歷這個“桶”下的所有entry的過程,這個時候如果出現閉環,那麼get()操作一直耗在這個閉環裡面,肯定就是死迴圈了
在這裡插入圖片描述
hashmap1.7和1.8的區別?
在這裡插入圖片描述
解釋: 其實就是說1.8的時候,當一個“桶”中的元素個數超過8的時候,那個“桶”的結構變成“紅黑樹”

4.ConcurrentHashMap

ConcurrentHashMap與HashMap相比,最關鍵的是要理解一個概念:segment。 Segment其實就是一個Hashmap 。Segment也包含一個HashEntry陣列,陣列中的每一個HashEntry既是一個鍵值對,也是一個連結串列的頭節點。 Segment物件在ConcurrentHashMap集合中有2的N次方個(解釋: 之所以是2的n次方個的原因是為了方便“與運算”,我們記得位運算的效率要高於取模運算的效率(這也是計算機是二進位制的原因),所以是2的n次方,還可以參考hashmap為什麼擴容是2的n次方,參考連結:https://blog.csdn.net/qq_40241957/article/details/84995597
),共同儲存在一個名為segments的陣列當中。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
小疑問: 為什麼一定要按順序鎖定所有段,才不會發生死鎖?如果不按順序鎖定所有段,就會發生死鎖???
答:
在這裡插入圖片描述

5.HashTable底層原理

在這裡插入圖片描述
在這裡插入圖片描述

6.HashSet

解釋: HashSet底層是基於HashMap實現的)
在這裡插入圖片描述

相關文章