Java Vector和ArrayList的異同分析及例項講解
線上程中有兩種常用的方法,能夠通過陣列實現相應的功能,但除此之外在區別上也是很明顯的。本篇就其中的代表方法ArrayList和Vector進行比較分析,一個是非執行緒安全,另一個是執行緒安全。在進行相同和不同點的分析之後,帶來二者的例項程式碼對比,幫助大家體會它們的異同。
1.相同點
(1)都是有序集合。
(2)資料不允許重複。
(3)都實現了list介面。
(4)都是通過陣列實現的。
(5)陣列進行復制、移動、代價比較高,因此,適合隨機查詢和遍歷,不適合插入和刪除。
2.不同點
(1)ArrayList屬於執行緒不安全(執行緒不同步)即當多執行緒進行對ArrayList集合的操作時,有可能對資料進行不正確的操作。如果只有一個執行緒會訪問到集合,那最好是使用ArrayList,因為它不考慮執行緒安全,效率會高些。
(2)Vector是執行緒安全的(同步執行緒)即當在同一時刻只能有一個執行緒進行對Vector集合的操作時,但是Vector要做到執行緒同步,需要大量的花費,可能消耗大量的記憶體或者CPU。如果有多個執行緒會訪問到集合,那最好是使用Vector,因為不需要我們再去考慮和編寫執行緒安全的程式碼。
(3)ArrayList在記憶體不夠時預設擴充套件1.5倍,Vector是預設擴充套件1倍。
(4)Vector提供indexOf(object,start)介面,ArrayList沒有。
3.例項程式碼對比
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); } }
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); } }
Java中Vector和ArrayList的區別
首先看這兩類都實現List介面,而List介面一共有三個實現類,分別是ArrayList、Vector和LinkedList。List用於存放多個元素,能夠維護元素的次序,並且允許元素的重複。3個具體實現類的相關區別如下:
1、ArrayList是最常用的List實現類,內部是通過陣列實現的,它允許對元素進行快速隨機訪問。陣列的缺點是每個元素之間不能有間隔,當陣列大小不滿足時需要增加儲存能力,就要講已經有陣列的資料複製到新的儲存空間中。當從ArrayList的中間位置插入或者刪除元素時,需要對陣列進行復制、移動、代價比較高。因此,它適合隨機查詢和遍歷,不適合插入和刪除。
2、Vector與ArrayList一樣,也是通過陣列實現的,不同的是它支援執行緒的同步,即某一時刻只有一個執行緒能夠寫Vector,避免多執行緒同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問ArrayList慢。
3、LinkedList是用連結串列結構儲存資料的,很適合資料的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了List介面中沒有定義的方法,專門用於操作表頭和表尾元素,可以當作堆疊、佇列和雙向佇列使用。
4、vector是執行緒(Thread)同步(Synchronized)的,所以它也是執行緒安全的,而Arraylist是執行緒非同步(ASynchronized)的,是不安全的。如果不考慮到執行緒的安全因素,一般用Arraylist效率比較高。
5、如果集合中的元素的數目大於目前集合陣列的長度時,vector增長率為目前陣列長度的100%,而arraylist增長率為目前陣列長度的50%.如過在集合中使用資料量比較大的資料,用vector有一定的優勢。
6、如果查詢一個指定位置的資料,vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist都可以。而
如果移動一個指定位置的資料花費的時間為0(n-i)n為總長度,這個時候就應該考慮到使用Linkedlist,因為它移動一個指定位置的資料,所花費的時間為0(1),而查詢一個指定位置的資料時花費的時間為0(i)。
ArrayList 和Vector是採用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,
都允許直接序號索引元素,但是插入資料要設計到陣列元素移動 等記憶體操作,所以索引資料快插入資料慢,
Vector由於使用了synchronized方法(執行緒安全)所以效能上比ArrayList要差
,LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行向前或向後遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入數度較快!
7、籠統來說:LinkedList:增刪改快
ArrayList:查詢快(有索引的存在)
到此這篇關於Java Vector和ArrayList的異同分析及例項講解的文章就介紹到這了,更多相關Java Vector和ArrayList的異同分析內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!