LinkedList、ArrayList、Vector三者的關系與區別?
區分ArrayList,Vector,LinkedList的區別
ArrayList,Vector的區別:
1.出現版本:
ArrayList(1.2),Vector(1.0),Collection(1.2),也就是說Vector出現的更早(老版本的動態數組,與HashTable一樣在jdk1.0)
Vector:elementData,當執行構造方法時候初始化大小為10
ArrayList:調用無參構造(elementData),初始化大小為空
2.初始化策略區別:
Vector在調用無參構造執行后將對象數組初始化為10
ArrayList采用懶加載策略,在構造方法階段並不初始化對象數組,在第一次添加元素的時候才初始化對象數組(add方法)
3.擴容策略:
ArrayList擴容的時候,新數組大小變為原數組大小的1.5倍
Vector擴容的時候,新數組大小變為原數組的2倍
4.線程安全性:
ArrayList采用異步處理,線程不安全,效率較高
Vector采用在方法上加鎖,線程安全,效率較高(即便要使用線程安全的List,也不要用Vector)
5.遍歷:
Vector支持較老的迭代器Enumeration
ArrayList不支持
ArrayList,Vector的共同點;
底層均使用數組實現
ArrayList,LinkedList:
LinkedList底層采用雙向鏈表實現,所以不存在擴容,初始化問題,並且add方法沒有加鎖,所以它和ArrayList一樣同為異步實現
ArrayList底層采用數組實現
a、LinkedList、ArrayList、Vector都是List接口的字類,其中LinkedList基於雙向鏈表實現,ArrayList和Vector基於數組實現
b、ArrayList采用懶加載模式,在第一次添加元素的時候,初始化內部數組,初始大小為10,擴容大俠為原先為1.5倍,采用異步處理,線程不安全,性能較高,在80%的場景下應用
c、Vector在產生對象時候初始化大小為10的內部數組、擴容為原先的2倍,采用synchronized修飾常用的增刪查改方法,線程安全,性能較低(讀讀互斥)
Stack是Vector的子類
d、常見的插入刪除在尾部ArrayList比較快,在指定位置的時候,LinkedList比較快,在任意位置的插入與刪除會考慮使用LinkedList(因為LInkedList是鏈表,指定位置快,而ArrayList需要將插入元素以后的元素整體向后挪動)
額外備注:
LinkedList實現Deque接口,Deque接口繼承Queue,所以,LinkedList也實現了Queue接口
ArrayList繼承AbastactList
Arrays.copyOf() , Arrays.sort() , Arrays.aslist