ArrayList,Vector和LinkedList區別詳解
一、ArrayList
ArrayList是一個可以處理變長陣列的型別,這裡不侷限於“數”組,ArrayList是一個泛型類,可以存放任意型別的物件。顧名思義,ArrayList是一個數組列表,因此其內部是使用一個數組來存放物件的,因為Object是一切型別的父類,因而ArrayList內部是有一個Object型別的陣列類存放物件。ArrayList類常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同時ArrayList內部有一個私有類實現Iterator介面,因此可以使用iterator()方法得到ArrayList的迭代器,同時,還有一個私有類實現了ListIterator介面,因此ArrayList也可以呼叫listIterator()方法得到ListIterator迭代器。
由於ArrayList是依靠陣列來存放物件的,只不過封裝起來了而已,因此其一些查詢方法的效率都是O(n),跟普通的陣列效率差不多,只不過這個ArrayList是一個可變”陣列“,並且可以存放一切指定的物件。
另外,由於ArrayList的所有方法都是預設在單一執行緒下進行的,因此ArrayList不具有執行緒安全性。若想在多執行緒下使用,應該使用Colletions類中的靜態方法synchronizedList()對ArrayList進行呼叫即可。
二、LinkedList
LinkedList可以看做為一個雙向連結串列,所有的操作都可以認為是一個雙向連結串列的操作,因為它實現了Deque介面和List介面。同樣,LinkedList也是執行緒不安全的,如果在併發環境下使用它,同樣用Colletions類中的靜態方法
在LinkedList的內部實現中,並不是用普通的陣列來存放資料的,而是使用結點<Node>來存放資料的,有一個指向連結串列頭的結點first和一個指向連結串列尾的結點last。不同於ArrayList只能在陣列末尾新增資料,LinkList可以很方便在連結串列頭或者連結串列尾插入資料,或者在指定結點前後插入資料,還提供了取走連結串列頭或連結串列尾的結點,或取走中間某個結點,還可以查詢某個結點是否存在。add()方法預設在連結串列尾部插入資料。總之,LinkedList提供了大量方便的操作方法,並且它的插入或增加等方法的效率明顯高於ArrayList型別,但是查詢的效率要低一點,因為它是一個雙向連結串列。
因此,LinkedList與ArrayList最大的區別是LinkedList更加靈活,並且部分方法的效率比ArrayList對應方法的效率要高很多,對於資料頻繁出入的情況下,並且要求操作要足夠靈活,建議使用LinkedList;對於陣列變動不大,主要是用來查詢的情況下,可以使用ArrayList。
三、Vector
Vector也是一個類似於ArrayList的可變長度的陣列型別,它的內部也是使用陣列來存放資料物件的。值得注意的是Vector與ArrayList唯一的區別是,Vector是執行緒安全的,即它的大部分方法都包含有關鍵字synchronized,因此,若對於單一執行緒的應用來說,最好使用ArrayList代替Vector,因為這樣效率會快很多(類似的情況有StringBuffer與StringBuilder);而在多執行緒程式中,為了保證資料的同步和一致性,可以使用Vector代替ArrayList實現同樣的功能。