1. 程式人生 > >List介面與ArrayList、LinkedList、Vector類

List介面與ArrayList、LinkedList、Vector類

1.List是集合列表介面,ArrayList和LinkedList都是List介面的實現類,表示一種有序的集合,其中的元素可以重複。

2.ArrayList的動態擴容機制

當ArrayList中增加一個新的物件時,Java會檢查ArrayList確保現有的陣列有足夠的容量來儲存這個新物件,如果沒有足夠容量就新建一個更大長度的陣列,舊的陣列使用Array.copyOf方法複製到新陣列中,現有的陣列引用指向新的陣列。

3.Array和ArrayList的區別

(1)Array可以包含基本資料型別和物件型別,ArrayList只能包含物件型別;

(2)Array的大小是固定的,ArrayList的大小是變化的;

(3)ArrayList提供了更多的方法和特性;

4.LinkedList工作原理和實現

LinkedList是以雙鏈表實現,連結串列容量無限制(本身需要消耗額外的連結串列指標空間來操作),其內部主要成員為first和last兩個node節點,在每次修改列表時用來指引雙向列表的首尾位置。當我們使用下標方式呼叫列表的get(index),set(index, e)方法時需要遍歷連結串列將指標移動到位進行訪問(會判斷index是否大於連結串列長度的一般決定是首部遍歷還是尾部遍歷,訪問的複雜度為O(N/2)),無法像ArrayList那樣進行隨機訪問,只有在兩頭的操作(如add(), addFirst(), removeFirst()等)才不需要進行遍歷尋找定位。

5.ArrayList和LinkedList各自適用的場景和原因

ArrayList是動態陣列順序表,順序表的儲存地址是連續的,所以查詢比較快,可以根據下標進行O(1)複雜度的查詢,但是插入和刪除由於需要對其他元素進進行移動,所以比較費時,效率較低,所以ArrayList適合查詢操作,不適合增刪操作;

LinkedList是雙向連結串列的資料結構,同時實現了雙端佇列Deque介面,連結串列節點的儲存地址是不連續的,每個儲存地址通過指標關聯,在查詢時需要遍歷指標遍歷節點,所以查詢速度慢,但是插入和刪除時比較快,只需要修改指標指向即可。

6.Vector的特點

Vector是執行緒安全的動態陣列,同ArrayList一樣繼承自AbstractList,內部實現依然基於陣列,Vector是執行緒安全的,會在可能出現執行緒安全的方法前面加上synchronized關鍵字,和ArrayList相似,隨機訪問速度快,插入和刪除的速率慢,支援null元素,有序,元素可以重複,不能存放基本資料型別的資料,加入的資料均為物件。