Java中Vector和ArrayList,LinkedList的區別
文章目錄
- ArrayList 和 Vector 、LinkedLis t原理
- ArrayList 和 Vector 部分原始碼解析
- ArrayList 和 Vector 、LinkedList 的使用
- ArrayList 和 Vector 、LinkedList 區別總結
1.ArrayList 和 Vector 、LinkedLis t原理
首先List介面一共有三個實現類,分別是ArrayList、Vector和LinkedList。List用於存放多個元素,能夠維護元素的次序,並且允許元素的重複。3個具體實現類的相關區別如下:
(1).ArrayList是最常用的List實現類,內部通過陣列實現的
,它允許對元素進行隨機訪問。陣列的缺點是每個元素之間不能有間隔,當陣列大小不滿足時需要增加儲存能力。當從ArrayList的中間位置插入或者刪除元素時,需要對陣列進行復制、移動、代價比較高。因此,它適合隨機查詢和遍歷,不適合插入和刪除。
(2).Vector與ArrayList一樣,也是通過陣列實現的,不同的是它支援執行緒的同步,即某一時刻只有一個執行緒能夠寫Vector,但實現同步需要很高的花費,因此,訪問它比訪問ArrayList慢。
(3).LinkedList是採用連結串列結構儲存資料的,很適合資料的動態插入和刪除,但隨機訪問和遍歷速度比較慢。另外,他還提供了List介面中沒有定義的方法,專門用於操作表頭和表尾元素,可以當作堆疊、佇列和雙向佇列使用
2.ArrayList 和 Vector 部分原始碼解析
(1).ArrayList:
public boolean add(E e) {
ensureCapacity(size + 1); // 增加元素,判斷是否能夠容納。不能的話就要新建陣列
elementData[size++] = e;
return true;
}
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1; // 增加新的陣列的大小
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
(2).Vector:
private void ensureCapacityHelper(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object[] oldData = elementData;
int newCapacity = (capacityIncrement > 0) ?
(oldCapacity + capacityIncrement) : (oldCapacity * 2); //增加新的陣列空間
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
3.ArrayList 和 Vector 、LinkedList 的使用
(1).Vector :
public class VectorDemo{
public static void main(String[] args){
//Vector的建立
//使用Vector的構造方法進行建立
Vector v = new Vector(4);
//向Vector中新增元素
//使用add方法直接新增元素
v.add("Test0");
v.add("Test1");
v.add("Test0");
v.add("Test2");
v.add("Test2");
//從Vector中刪除元素
v.remove("Test0"); //刪除指定內容的元素
v.remove(0); //按照索引號刪除元素
//獲得Vector中已有元素的個數
int size = v.size();
System.out.println("size:" + size);
//遍歷Vector中的元素
for(int i = 0;i < v.size();i++){
System.out.println(v.get(i));
}
}
}
(2).ArrayList :
ArrayList List = new ArrayList();
for( int i=0;i <10;i++ ) //給陣列增加10個Int元素
List.Add(i);
//..程式做一些處理
List.RemoveAt(5);//將第6個元素移除
for( int i=0;i <3;i++ ) //再增加3個元素
List.Add(i+20);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));//返回ArrayList包含的陣列
int x=list.get(i) 查詢某個資料
(3).LinkedList :
用法實在太豐富了,這裡就不詳細寫了,請參考這篇部落格!!!
http://blog.csdn.net/i_lovefish/article/details/8042883
4.ArrayList 和 Vector 、LinkedList 區別總結
結合上面幾條關於ArrayList和Vector,LinkedList區別如下:
**(1).**ArrayList在記憶體不夠時預設是擴充套件50% + 1個,Vector是預設擴充套件1倍。
**(2).**Vector提供indexOf(obj, start)介面,ArrayList沒有
**(3).**Vector屬於執行緒安全級別的,但是大多數情況下不使用Vector,因為執行緒安全需要更大的系統開銷
(4).如果查詢一個指定位置的資料,vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist都可以。而如果移動一個指定位置的資料花費的時間為0(n-i)n為總長度,這個時候就應該考慮到使用Linkedlist,因為它移動一個指定位置的資料所花費的時間為0(1),而查詢一個指定位置的資料時花費的時間為0(i)
**(5).**Vector由於使用了synchronized方法(執行緒安全)所以效能上比ArrayList要差,LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行向前或向後遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入數度較快
總的來說:
LinkedList:增刪改快
Vector:執行緒安全
ArrayList:查詢快(有索引的存在)