java面試總結之集合框架

2021-08-20 14:35:04 字數 2091 閱讀 4055

1.arraylist:採用了陣列的結構,查詢快,增刪慢(需要維護下標),執行緒不安全

2.linkedlist:採用了鍊錶的結構,增刪快,查詢慢

3.vector:陣列結構,執行緒安全的

4.hashset:實現了set介面,它不允許集合中出現重複元素。當我們提到hashset時,第一件事就是在將物件儲存在hashset之前,要確保重寫hashcode()方法和equals()方法

5.treeset:是sortedset介面的唯一實現類,treeset可以確保集合元素處於排序狀態

6.hashmap:

在jdk1.8之前,hashmap採用陣列+鍊錶實現,即使用煉表處理衝突,同一hash值的節點都儲存在乙個煉表裡。但是當位於乙個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查詢的效率較低。而jdk1.8中,hashmap採用陣列+鍊錶+紅黑樹實現,當鍊表長度超過閾值(8)時,將鍊錶轉換為紅黑樹,這樣大大減少了查詢時間。

7.鍊錶和紅黑的查詢複雜度對比:

鍊錶:把所有資料都遍歷一遍,然後找到你所需要的資料,複雜度是o(n)

紅黑樹:二分法查詢,實現複雜度是log(n)

8.hashtable:底層資料結構跟hashmap一致,執行緒安全的hashmap,採用synchronized實現

9.concurrenthashmap

在jdk1.6中concurrenthashmap使用鎖分段技術提高併發訪問效率。首先將資料分成一段一段地儲存,然後給每一段資料配乙個鎖,當乙個執行緒占用鎖訪問其中一段資料時,其他段的資料也能被其他執行緒訪問。然而在jdk1.8中的實現已經拋棄了segment分段鎖機制,利用cas+synchronized來保證併發更新的安全,底層依然採用陣列+鍊錶+紅黑樹的儲存結構。

jdk1.6資料結構

concurrenthashmap採用 分段鎖的機制,實現併發的更新操作,底層由segment陣列和hashentry陣列組成。segment繼承reentrantlock用來充當鎖的角色,每個 segment 物件守護每個雜湊對映表的若干個桶。hashentry 用來封裝對映表的鍵 / 值對;每個桶是由若干個 hashentry 物件鏈結起來的鍊錶。乙個 concurrenthashmap 例項中包含由若干個 segment 物件組成的陣列

jdk1.8的concurrenthashmap分析

a.取消segments欄位,直接採用transient volatile hashentry(k,v) table儲存資料,採用table陣列元素作為鎖,從而實現了對每一行資料進行加鎖,進一步減少併發衝突的概率。

b.將原先table陣列+單向鍊錶的資料結構,變更為table陣列+單向鍊錶+紅黑樹的結構。對於hash表來說,最核心的能力在於將key hash之後能均勻的分布在陣列中。如果hash之後雜湊的很均勻,那麼table陣列中的每個佇列長度主要為0或者1。但實際情況並非總是如此理想,雖然concurrenthashmap類預設的載入因子為0.75,但是在資料量過大或者運氣不佳的情況下,

還是會存在一些佇列長度過長的情況,如果還是採用單向列表方式,那麼查詢某個節點的時間複雜度為o(n);因此,對於個數超過8(預設值)的列表,jdk1.8中採用了紅黑樹的結構,那麼查詢的時間複雜度可以降低到o(logn),可以改進效能。

集合框架面試總結

1 collection下list,set,還有什麼?還有queue佇列 2 hashset是怎麼實現的?底層利用hashmap來實現,用key作為元素儲存,value使用乙個final值。3 hashmap為什麼儲存2的n次冪個空間?hashmap是根據key的hash值決定key放到哪個桶中,通...

Java集合框架總結

list集合要點總結 1.集合框架的最頂層為collection介面。2.集合裡存放的並不是物件的實體,而是物件實體的引用位址。3.集合可以通過迭代器 iterator 來遍歷元素,iterator 方法實際上是返回了集合中的乙個內部類例項,該內部類例項實現了iterator介面,並且可以直接訪問儲...

Java 集合框架總結

1.元素是否可以為null 除了hashtable外,vector,arraylist,linkedlist,treeset,hashset,hashmap,linkedhashmap,treemap 元素都可以為空 2.是否線性安全 除hashtable,vecotr外,其他都不是執行緒安全的。在...