天天看點

Java -- 每日一問:對比 Vector、ArrayList、LinkedList 有何差別?

Java -- 每日一問:對比 Vector、ArrayList、LinkedList 有何差別?

典型回答

這三者都是實作集合架構中的 List,也就是所謂的有序集合,是以具體功能也比較近似,比如都提供按照位置進行定位、添加或者删除的操作,都提供疊代器以周遊其内容等。但因為具體的設計差別,在行為、性能、線程安全等方面,表現又有很大不同。

Vector 是 Java 早期提供的線程安全的動态數組,如果不需要線程安全,并不建議選擇,畢竟同步是有額外開銷的。Vector 内部是使用對象數組來儲存資料,可以根據需要自動的增加容量,當數組已滿時,會建立新的數組,并拷貝原有數組資料。

ArrayList 是應用更加廣泛的動态數組實作,它本身不是線程安全的,是以性能要好很多。與 Vector 近似,ArrayList 也是可以根據需要調整容量,不過兩者的調整邏輯有所差別,Vector 在擴容時會提高 1 倍,而 ArrayList 則是增加 50%。

LinkedList 顧名思義是 Java 提供的雙向連結清單,是以它不需要像上面兩種那樣調整容量,它也不是線程安全的。

高手回答

Vector、ArrayList、LinkedList均為線型的資料結構,但是從實作方式與應用場景中又存在差别。

1 底層實作方式

ArrayList内部用數組來實作;LinkedList内部采用雙向連結清單實作;Vector内部用數組實作。

2 讀寫機制

ArrayList在執行插入元素是超過目前數組預定義的最大值時,數組需要擴容,擴容過程需要調用底層System.arraycopy()方法進行大量的數組複制操作;在删除元素時并不會減少數組的容量(如果需要縮小數組容量,可以調用trimToSize()方法);在查找元素時要周遊數組,對于非null的元素采取equals的方式尋找。

LinkedList在插入元素時,須建立一個新的Entry對象,并更新相應元素的前後元素的引用;在查找元素時,需周遊連結清單;在删除元素時,要周遊連結清單,找到要删除的元素,然後從連結清單上将此元素删除即可。

Vector與ArrayList僅在插入元素時容量擴充機制不一緻。對于Vector,預設建立一個大小為10的Object數組,并将capacityIncrement設定為0;當插入元素數組大小不夠時,如果capacityIncrement大于0,則将Object數組的大小擴大為現有size+capacityIncrement;如果capacityIncrement<=0,則将Object數組的大小擴大為現有大小的2倍。

3 讀寫效率

ArrayList對元素的增加和删除都會引起數組的記憶體配置設定空間動态發生變化。是以,對其進行插入和删除速度較慢,但檢索速度很快。

LinkedList由于基于連結清單方式存放資料,增加和删除元素的速度較快,但是檢索速度較慢。

4 線程安全性

ArrayList、LinkedList為非線程安全;Vector是基于synchronized實作的線程安全的ArrayList。

需要注意的是:單線程應盡量使用ArrayList,Vector因為同步會有性能損耗;即使在多線程環境下,我們可以利用Collections這個類中為我們提供的synchronizedList(List list)方法傳回一個線程安全的同步清單對象。

問題回答