JDK容器學習之List: CopyOnWriteArrayList,ArrayList,LinkedList對比

列表

List, ArrayList, LinkedList, CopyOnWriteArrayList, Vectorjava

簡述

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

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

線程非安全:ArrayList, LinkedList安全


2. 底層存儲

數組: ArrayList Vecotr CopyOnWriteArrayList數據結構

雙向鏈表:LinkedList性能

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

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

addRemove

LinkedList : 底層存儲爲雙向鏈表blog

add

CopyArrayList:底層存儲爲數組排序

add


3. 使用場景和說明

ArrayList接口

  • 底層爲數組,適合隨機訪問
  • 刪除不會引發數組容量變小
  • 動態插入可能涉及到數組長度從新分配
  • 爲避免頻繁的數組擴容,可設置一個合適的初始容量
  • 不適用於頻繁的在數組中間進行插入刪除的場景

LinkedList

  • 底層爲雙向鏈表,適合頻繁刪除新增的場景
  • 隨機訪問不友好,須要遍歷

Vector

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

CopyOnWriteArrayList

  • 線程安全
  • 讀方法不加鎖;修改方法加鎖,一次只能一個寫線程訪問
  • 修改時,會拷貝一分內容出來,對拷貝的結果進行操做,最後覆蓋以前的內容
  • 遍歷和讀取都是基於訪問時刻列表中的數組進行的;在執行過程當中,鏈表發生修改不會影響遍歷和讀取的結果(即此時訪問的依然是原數組內容)

4. 特性

  • List 是有序的
  • ArrayList 默認容量爲10;LinkedList, CopyOnWriteArrayList默認容量爲0
  • new ArrayList<>() 內部的數組實際上引用的是一個空數組
  • ArrayList 擴容規則
    • 增長原來空間大小的一半
    • 若是依然塞不下,則擴充到正好填充滿的狀況
  • 排序
    • Collections.sort(list, new Comparator(){xxx})
    • 若List中的元素,實現了Comparater接口後,能夠直接調用 Collections.sort(list);
  • 須要線程安全的場景,使用 CopyOnWriteArrayListCollections.synchronizedList 來替代 Vector

掃描關注,java分享

相關文章
相關標籤/搜索