線程安全:Vector,CopyOnWriteArrayList,Collections.synchronizedList()數組
線程非安全:ArrayList,LinkedList安全
數組:ArrayList, Vecotr, CopyOnWriteArrayList數據結構
雙向鏈表:LinkedList併發
經過三個添加元素的過程圖,來看數據結構性能
ArrayList,Vector: 底層存儲爲數組spa
LinkedList: 底層存儲爲雙向鏈表線程
CopyArrayList:底層存儲爲數組排序
ArrayList接口
底層爲數組,適合隨機訪問it
刪除不會引發數組容量變小
動態插入可能涉及到數組長度從新分配
爲避免頻繁的數組擴容,可設置一個合適的初始容量
不適用於頻繁的在數組中間進行插入刪除的場景
LinkedList
底層爲雙向鏈表,適合頻繁刪除新增的場景
隨機訪問不友好,須要遍歷
Vector
線程安全
全部的方法都加鎖,致使性能較差
CopyOnWriteArrayList
線程安全
讀方法不加鎖;修改方法加鎖,一次只能一個寫線程訪問
修改時,會拷貝一分內容出來,對拷貝的結果進行操做,最後覆蓋以前的內容;每次修改都會先上鎖,而後進行數組拷貝,因此性能較ArrayList低;讀取無鎖,因此讀的性能比Vector高(沒有競爭);默認初始容量爲0
遍歷和讀取都是基於訪問時刻列表中的數組進行的;在執行過程當中,鏈表發生修改不會影響遍歷和讀取的結果(即此時訪問的依然是原數組內容)
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);