ArrayList, LinkedList, CopyOnWriteArrayList, Vector對比

1. 列表劃分爲線程安全和線程非安全兩類

線程安全:Vector,CopyOnWriteArrayList,Collections.synchronizedList()數組

線程非安全:ArrayList,LinkedList安全

2. 底層存儲

數組:ArrayList, Vecotr, CopyOnWriteArrayList數據結構

雙向鏈表:LinkedList併發

經過三個添加元素的過程圖,來看數據結構性能

ArrayList,Vector: 底層存儲爲數組spa

 

LinkedList: 底層存儲爲雙向鏈表線程

CopyArrayList:底層存儲爲數組排序

3. 使用場景和說明

ArrayList接口

  • 底層爲數組,適合隨機訪問it

  • 刪除不會引發數組容量變小

  • 動態插入可能涉及到數組長度從新分配

  • 爲避免頻繁的數組擴容,可設置一個合適的初始容量

  • 不適用於頻繁的在數組中間進行插入刪除的場景

 LinkedList

  • 底層爲雙向鏈表,適合頻繁刪除新增的場景

  • 隨機訪問不友好,須要遍歷

Vector

  • 線程安全

  • 全部的方法都加鎖,致使性能較差

CopyOnWriteArrayList

  • 線程安全

  • 讀方法不加鎖;修改方法加鎖,一次只能一個寫線程訪問

  • 修改時,會拷貝一分內容出來,對拷貝的結果進行操做,最後覆蓋以前的內容;每次修改都會先上鎖,而後進行數組拷貝,因此性能較ArrayList低;讀取無鎖,因此讀的性能比Vector高(沒有競爭);默認初始容量爲0

  • 遍歷和讀取都是基於訪問時刻列表中的數組進行的;在執行過程當中,鏈表發生修改不會影響遍歷和讀取的結果(即此時訪問的依然是原數組內容)

 4. 特性

1. List是有序的

2. ArrayList默認容量爲10;

3. LinkedList,CopyOnWriteArrayList默認容量爲0

4. new ArrayList<>()內部的數組實際上引用的是一個空數組

5. 須要線程安全的場景,使用CopyOnWriteArrayList(併發讀性能好)或Collections.synchronizedList(併發寫性能好)來替代Vector

6. ArrayList擴容規則

  • 增長原來空間大小的一半

  • 若是依然塞不下,則擴充到正好填充滿的狀況

7. 排序

  • Collections.sort(list, new Comparator(){xxx})

  • 若List中的元素,實現了Comparable接口後,能夠直接調用Collections.sort(list);

相關文章
相關標籤/搜索