1. 程式人生 > >與集合相關問題的總結

與集合相關問題的總結

https://mp.weixin.qq.com/s/20df3rxU1yOb2QvqNrE5JA轉載於JAVA面試通關手冊

1.Arraylist 與 LinkedList 異同

1.均是非執行緒安全;
2.ArrayList底層陣列實現;LinkedList是雙向連結串列實現;
3.ArrayList插入add()直接從陣列末尾插入,複雜度O(1),按照位置插入
則需要向後移動元素O(n);LinkedList插入均為O1);
4.ArrayList支援RandomAccess介面,LinkedList則不支援當真正對陣列進行新增時
,才真正分配容量。每次按照1.5倍(位運算)的比率通過copeOf的方式擴容。
6.
ArrayList的空 間浪費主要體現在在list列表的結尾會預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗比ArrayList更多的空間(因為要存放直接後繼和直接前驅以及資料)。

2.ArrayList 與 Vector 區別

Vector的所有方法都實現了同步,比較耗費資源。

3.HashMap的底層實現

1.是一個基於陣列-連結串列結構的資料結構,通過關鍵詞的雜湊函式得到雜湊值,然後
為了分配連結串列長度均勻,採用了取餘的演算法,此處除數為2的冪次是因為,這個取
餘數的操作可以轉化為對雜湊值和雜湊值減一做與運算,與運算的效率要比取餘高。
如果產生了雜湊衝突,則在陣列後的連結串列中插入資料。
2.查詢方法,如果沒有雜湊衝突,那麼一次就可以找到,如果有連結串列,那麼遍歷連結串列;
插入也是,如果沒有雜湊衝突,一次就可以,如果有連結串列,直接插入連結串列頭即可;
3.JDK1.8之後,對於HashMap進行了優化,即當連結串列節點數大於8(閾值)的時候,
將連結串列結構變為紅黑樹,以減少搜尋時間
4.雜湊表相對於連結串列查詢快,相對於資料插入快

4.HashMap 和 Hashtable 的區別

1.HashMap不能保證執行緒安全,Hashtable通過sychronized實現執行緒安全;
2.HashMap效率高(因為沒有Sychronized)
2.Hashtable JDK1.8以後並沒有像HashMap一樣利用紅黑樹優化
4.HashMap支援只有一個NULL的鍵值,支援多個鍵值對的VALUE為NULL5.a.初始容量hashtable是11,之後擴容每次2n+1;hashmap是16,擴容是兩倍
b.初始化如果hashtable給了指定容量,則按該值初始化;hashmap是擴容到2的冪次
原因見問題5

5.HashMap 的長度為什麼是2的冪次方

見第三個問題

6.HashSet 和 HashMap 區別

1.hashmap實現map介面;hashset實現set介面
2.hashmap利用key計算hashcode;hashset利用成員物件計算
3.所以hashmap比hashset效率高
4.hashmap用put新增;hashset用add
5.hashmap儲存鍵值對;hashset儲存物件

7.ConcurrentHashMap 和 Hashtable 的區別

1.底層結構 jdk1.8後CurrentHashMap也採用了陣列+連結串列/紅黑樹;
而HashTable則依舊是陣列+連結串列
2.實現同步方式
a.CurrentHashMap JDK1.8之前採用Segment的概念,即每把鎖只鎖其中
的一部分,提高了訪問率併發率,1.8之後採用sychronized和CAS模式
(1.6之後優化了sychronized)
b.Hashtable就採用一個鎖的模式,效率很低

8.ConcurrentHashMap執行緒安全的具體實現方式/底層具體實現

1.ConcurrentHashMap包含一個Segment陣列,每個Segment包含一個HashEntry陣列,
當修改HashEntry陣列採用開鏈法處理衝突,所以它的每個HashEntry元素又是連結串列結構的
元素。
所以我覺得hashentry更像是Hashmap,而segment負責每個hashentry的鎖實現。
2.currenthashmap jdk1.8之後 通過sychronized+CAS實現同步;只鎖定連結串列或二叉
樹的首節點,只要雜湊值不衝突,就不會產生併發

9.集合框架底層資料結構總結

1.list
arraylist:陣列
vector:陣列
linkedlist:雙向連結串列
2.set
hashset(無序,唯一):基於hashmap實現,底層採用hashmap的資料結構
linkedhashset:繼承與hashset,內部實現與linkedhashmap很像
treeset(有序,唯一):紅黑樹
3.map
hashmap:不說了
linkedhashmap:繼承自hashmap,同時添加了雙向連結串列,實現了訪問順序的操作
hashtable:不說
treemap:紅黑樹(自平衡二叉樹)

產生的疑問:
紅黑樹和CAS的原理!