Java進階(四十六)簡述ArrayList、Vector與LinkedList的異同點
Collection類的繼承圖如下:
從圖中可以看出,LinkedList與ArrayList、ArrayDeque這三者都實現了List接口.所有使用方式也很相似,主要區別在于因為實現方式的不同,所以對不同的操作具有不同的效率。
ArrayList是一個可改變大小的數組.當更多的元素加入到ArrayList中時,其大小將會動態地增長。內部的元素可以直接通過get與set方法進行訪問,因為ArrayList本質上就是一個數組。
List arrayList = new ArrayList();
如果像上面這樣使用默認的構造方法,初始容量被設置為10。當ArrayList中的元素超過10個以后,會重新分配內存空間,使數組的大小增長到16??梢酝ㄟ^調試看到動態增長的數量變化:10->16->25->38->58->88->…(增長幅度為:len/2 + 1)
LinkedList是一個雙鏈表,在添加和刪除元素時具有比ArrayList更好的性能.但在get與set方面弱于ArrayList。
當然,這些對比都是指數據量很大或者操作很頻繁的情況下的對比,如果數據和運算量很小,那么對比將失去意義。
Vector和ArrayList類似,但屬于強同步類。如果你的程序本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合/對象),那么使用ArrayList是更好的選擇。
Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%。而LinkedList還實現了Queue接口,該接口比List提供了更多的方法,包括
offer(),peek(),poll()等。
注意: 默認情況下ArrayList的初始容量非常小,所以如果可以預估數據量的話,分配一個較大的初始值屬于最佳實踐,這樣可以減少調整大小的開銷。
LinkedList與ArrayList、ArrayDeque的實現機制完全不同,ArrayList、ArrayDeque內部以數組的形式來保存集合中的元素,因此隨機訪問集合元素時有較好的性能;而LinkedList內部以鏈表的形式來保存集合中的元素,因此隨機訪問集合元素時性能較差,但在插入、刪除元素時性能非常出色(只需改變指針所指的地址即可)。
如果需要遍歷List集合元素,對于ArrayList、Vector集合,應該使用隨機訪問方法(get)來遍歷集合元素,這樣性能更好;對于LinkedList集合,則應該采用迭代器(Iterator)來遍歷集合元素;
如果需要經常執行插入、刪除操作來改變List集合的大小,則應該使用LinkedList集合,而不是ArrayList。使用ArrayList、Vector集合需要經常重新分配內部數組的大小,其時間開銷往往是使用LinkedList的幾十倍,效果更差;
如果有多個線程需要同時訪問List集合中的元素,開發者可考慮使用Collections工具類將集合包裝成線程安全的集合。
Java 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。