實現 List 的類 - 優點和缺點

List 介面是由不同的類實現的。他們每個人都有自己的方式來實施不同的策略,並提供不同的利弊。

實現 List 的類

這些是 Java SE 8 中實現 java.util.List 介面的所有 public 類:

  1. 抽象類:
    • AbstractList 中
    • AbstractSequentialList
  2. 具體類:
    • 陣列列表
    • AttributeList
    • CopyOnWriteArrayList
    • 連結串列
    • RoleList
    • RoleUnresolvedList
    • 向量

在時間複雜性方面的每個實現的優點和缺點

陣列列表

public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

ArrayList 是 List 介面的可調整大小的陣列實現。將列表儲存到陣列中, ArrayList 提供了用於運算元組大小的方法(除了實現 List 介面的方法 )。

初始化整數的 ArrayList,大小為 100

List<Integer> myList = new ArrayList<Integer>(100); // Constructs an empty list with the specified initial capacity.

- PROS:

size,isEmpty, getset ,iterator 和 listIterator 操作以恆定時間執行。因此獲取和設定 List 的每個元素具有相同的時間成本

int e1 = myList.get(0);  //   \
int e2 = myList.get(10); //    | => All the same constant cost => O(1)
myList.set(2,10);        //   /

- 缺點:

使用陣列(靜態結構)實現在陣列大小上新增元素的成本很高,因為需要為所有陣列進行新的分配。但是,從文件

新增操作以分攤的常量時間執行,即新增 n 個元素需要 O(n) 時間

刪除元素需要 O(n) 時間。

AttributeList

來了

CopyOnWriteArrayList

來了

連結串列

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable

LinkedList雙向 連結串列實現,連結串列資料結構由一組稱為節點的順序連結記錄組成。

Iitialize Integer 的 LinkedList

List<Integer> myList = new LinkedList<Integer>(); // Constructs an empty list.

- PROS:

在列表的前面或末尾新增或刪除元素具有恆定的時間。

myList.add(10);  // \
myList.add(0,2); //  | => constant time => O(1)
myList.remove(); // /

- CONS: 來自文件

索引到列表中的操作將從開頭或結尾遍歷列表,以較接近指定索引為準。

操作如:

myList.get(10);    // \
myList.add(11,25); //  | => worst case done in O(n/2)
myList.set(15,35); // /

RoleList

來了

RoleUnresolvedList

來了

來了

向量

來了