1. 程式人生 > >Vector/Arraylist/LinkedList

Vector/Arraylist/LinkedList

一. ArrayList 與 LinkedList 區別
ArrayList 和 LinkedList 都實現了 List 介面, 他們有以下的不同點:
ArrayList 是基於索引的資料介面, 它的底層是陣列。 它可以以 O(1)時間複雜度對元素進行隨機訪問。 與此對應, LinkedList 是以元素列表的形式儲存它的資料, 每一個元素都和它的前一個和後一個元素連結在一起, 在這種情況下, 查詢某個元素的時間複雜度是 O(n)。
相對於 ArrayList, LinkedList 的插入, 新增, 刪除操作速度更快, 因為當元素被新增到集合任意位置的時候, 不需要像陣列那樣重新計算大小或者是更新索引。LinkedList 比 ArrayList 更佔記憶體, 因為 LinkedList 為每一個節點儲存了兩個引用, 一個指向前一個元素, 一個指向下一個元素。
二. Vetor arraylist Linkedlist 區別
ArrayList 就是動態陣列, 是 Array 的複雜版本, 動態的增加和減少元素.當更多的元素加入到 ArrayList 中時,其大小將會動態地增長。 它的元素可以通過 get/set 方法直接訪問,因為 ArrayList 本質上是一個數組。 初始容量為 10

。 1.插入元素的時候可能擴容,刪除元素時不會縮小容量。2.擴容增長為 Arraylist 增長原來的 0.5 倍 3. 而 Arraylist 沒有設定增長空間
的方法。 4.執行緒不同步Vector 和 ArrayList 類似, 區別在於 Vector 是同步類(synchronized).因此,開銷就比ArrayList 要大。 初始容量為 10。 實現了隨機訪問介面, 可以隨機訪問。

Vector 是內部是以動態陣列的形式來儲存資料的。 1.Vector 還可以設定增長的空間大小, 2. 及 Vector 增長原來的 1 倍 3.vector 執行緒同步

LinkedList 是一個雙鏈表,在新增和刪除元素時具有比 ArrayList 更好的效能.但在 get與 set 方面弱於 ArrayList.當然,這些對比都是指資料量很大或者操作很頻繁的情況下的對比。 它還實現了 Queue 介面,該介面比 List 提供了更多的方法,包括 offer(),peek(),poll()等.

ArrayList 和 LinkedList 的使用場景, 其中 add 方法的實現 ArrayList,LinkedList 的實現以及插入, 查詢, 刪除的過程

三. 使用 ArrayList 的迭代器會出現什麼問題? 單執行緒和多執行緒環境下;
答: 常用的迭代器設計模式, iterator 方法返回一個父類實現的迭代器。
1、 迭代器的 hasNext 方法的作用是判斷當前位置是否是陣列最後一個位置, 相等為 false,否則為 true。
2、 迭代器 next 方法用於返回當前的元素, 並把指標指向下一個元素, 值得注意的是, 每次使用 next 方法的時候, 都會判斷建立迭代器獲取的這個容器的計數器 modCount 是否與此時 的 不 相 等 , 不 相 等 說 明 集 合 的 大 小 被 修 改 過 , 如 果 是 會 拋 出ConcurrentModificationException 異常, 如果相等呼叫 get 方法返回元素即可。

四. 陣列(Array)和列表(ArrayList)有什麼區別? 什麼時候應該使用 Array 而不是ArrayList?
答: 不同點: 定義上: Array 可以包含基本型別和物件型別, ArrayList 只能包含物件型別。 容量上: Array 大小固定, ArrayList 的大小是動態變化的。 操作上: ArrayList 提供更多的方法和特性, 如: addAll(), removeAll(), iterator()等等。 使用基本資料型別或者知道資料元素數量的時候可以考慮 Array;ArrayList 處理固定數量的基本型別資料型別時會自動裝箱來減少編碼工作量, 但是相對較慢。

五. ArrayList 和 Vector 有何異同點?
相同點:
(1) 兩者都是基於索引的, 都是基於陣列的。
(2) 兩者都維護插入順序, 我們可以根據插入順序來獲取元素。
(3) ArrayList 和 Vector 的迭代器實現都是 fail-fast 的。
(4) ArrayList 和 Vector 兩者允許 null 值, 也可以使用索引值對元素進行隨機訪問。
不同點:
(1) Vector 是同步, 執行緒安全, 而 ArrayList 非同步, 執行緒不安全。 對於 ArrayList, 如果迭代時改變列表, 應該使用 CopyOnWriteArrayList。
( 2) 但是, ArrayList 比 Vector 要快, 它因為有同步, 不會過載。
( 3) 在使用上, ArrayList 更加通用, 因為 Collections 工具類容易獲取同步列表和只讀列