Java Vector ArrayList LinkedList介紹及區別


1 區別與聯系

1.1 Vector ArrayList

Vector ArrayList 都是繼承與 List 的 Java 集合類。他們非常相識,是 List 的不同實現。

  1. 線程安全方面,Vector 是線程安全的,ArrayList 是不安全的.
  2. 訪問速度上,因為 Vector 是線程(Thread)同步(Synchronized)的,所以訪問效率要比 ArrayList 慢。

1.2 ArrayList LinkedList

  1. ArrayList 查詢快,復制、刪除、移動慢,當從ArrayList的中間位置插入或者刪除元素時,需要對數組進行復制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。
  2. LinkedList使用雙向鏈表實現存儲,存儲空間不需要連續空間,增加、刪除、移動快而查詢則慢。

2 介紹

2.1 ArrayList

ArrayList可以理解為長度可變的數組Array,JVM為其分配連續的內存空間,ArrayList可以進行動態的擴容,默認初始化容量為10(默認空的構造函數new ArrayList()),也可以new ArrayList(int initialCapacity)自定義初始化容量。

boolean add()

  1. 向 ArrayList 尾部增加一個元素
  2. 首先判斷當前 ArrayList 的容量,通過 if (minCapacity - elementData.length > 0) 來判斷
  3. 如果容量足夠則新增,如果不夠則使用 grow() 方法進行擴容,新的容量增加原來的一半。並且每進行一次擴容就會有一次數據的拷貝。

void add(int index, E element)

添加一個元素到指定的位置。

  1. 判斷當前 ArrayList 容量是否夠用,不夠則需要擴容。

E get(int index)

返回list指定位置的數據元素.

為了保證 ArrayList 的操作效率,一般來講,最好在初始化的時候設定他的大小,否則在實際操作過程中,遇到需要擴容的,則需要對數組進行復制等操作,比較耗費實際。

2.2 Vector

Vector 是 List 接口的一個多線程安全實現類,其結構與 ArrayList 非常相似,同樣是一個線性的動態可擴容數組,不過其擴容機制與 ArrayList 有一定的差別

boolean add(E e) / void addElement(E obj)

兩個方法都是向 Vector 尾部添加一個元素,先進行擴容校驗,然后把元素添加到末尾。

E get(int index)

獲取指定元素

Vector相關的方法基本都添加了synchronized關鍵字,從而保證了多線程下的線程安全性,但是在單線程下,Vector卻與ArrayList的性能有一定的差距。

LinkedList

LinkedList 同樣實現了 List 接口,因此其實現了List接口里面的所有方法。實際上,LinkedList 是基於雙向鏈表來實現的,因此其擁有鏈表具有的增加和刪除元素的效率高的優點,這一點基本上和順序表為結構基礎的 ArrayList 和 Vector 集合相對立。

boolean add(E e) / void add(int index, E element)

向 LinkedList 尾部增加元素

public boolean add(E e) {
    linkLast(e); //將元素e鏈接到鏈表末尾
    return true;
}
void linkLast(E e) {
    final Node<E> l = last; //臨時保存末尾節點
    final Node<E> newNode = new Node<>(l, e, null); //構造元素值為e的新節點
    last = newNode; //新節點為尾節點
    if (l == null)
        first = newNode;
    else
        l.next = newNode; //.next連接
    size++; //容量+1
    modCount++; //修改數標志+1
}

LinkedList 實現了 Deque 和 List 接口,因此也實現了 addFirst(E e) / addLast(E e) / offerFirst(E e) / offerLast(E e) / removeFirst() / removeLast() / pollFirst() / pollLast() / peekFirst() / peekLast()等方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM