一、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類中的靜態方法synchronizedList()對LinkedList進行調用即可。

在LinkedList的內部實現中,並不是用普通的數組來存放數據的,而是使用結點

來存放數據的,有一個指向鏈表頭的結點first和一個指向鏈表尾的結點last。不同於ArrayList只能在數組末尾添加數據,LinkList可以很方便在鏈表頭或者鏈表尾插入數據,或者在指定結點前後插入數據,還提供了取走鏈表頭或鏈表尾的結點,或取走中間某個結點,還可以查詢某個結點是否存在。add()方法默認在鏈表尾部插入數據。總之,LinkedList提供了大量方便的操作方法,並且它的插入或增加等方法的效率明顯高於ArrayList類型,但是查詢的效率要低一點,因爲它是一個雙向鏈表。

因此,LinkedList與ArrayList最大的區別是LinkedList更加靈活,並且部分方法的效率比ArrayList對應方法的效率要高很多,對於數據頻繁出入的情況下,並且要求操作要足夠靈活,建議使用LinkedList;對於數組變動不大,主要是用來查詢的情況下,可以使用ArrayList。

下面的代碼得不出結果速度太慢

下面化成ArrayList速度就超快

remove方法對LinkedList類的使用

a.利用iterator類

b.不利用iterator的話則則需要調用get方法。則效率很低

查看原文 >>
相關文章