1.我想從幾個方面 談談二者的區別
1.1 底層數據結構? 1.ArrayList基於動態數組存儲有序數據容器Arrays.copyOf
2.LinkedList基於鏈表方式存儲有序數據的容器【1.6 使用的雙向循環鏈表 1.7優化成無循環方式鏈表】
1.2 添加刪除效率?元素在固定非末端位置的添加或者刪除操作,LindedList【log(1)】優於ArrayList 【log(n-1)】,原因基於鏈表方式,修改 刪除只需改動指針引用,數組需要移動對象。
1.3 爲什麼ArrayList隨機訪問速度快?
隨機訪問速度快,意味着根據某個條件查詢也會更加的快。
ArrayList從原理上就是數據結構中的數組,也就是內存中一片連續的空間,這意味着,當我get(index)的時候,我可以根據 數組的(首地址+偏移量),直接計算出我想訪問的第index個元素在內存中的位置。寫過c的話,可以很容易的理解。
LinkedList可以簡單理解爲數據結構中的鏈表(說簡單理解,因爲其實是雙向循環鏈表),在內存中開闢的不是一段連續的空 間,而是每個元素有一個[元素|下一元素地址]這樣的內存結構。當get(index)時,只能從首元素開始,依次獲得下一個元素 的 地址。用時間複雜度表示的話,ArrayList的get(n)是o(1),而LinkedList是o(n)。
ArrayList的get()方法:時間複雜度爲O(1)
public AnyType get(int idx) {
if(idx < 0 || idx >= size())
throw new ArrayIndexOutOfBoundsException();
return theItems[idx];
}
LinkedList的get()方法:時間複雜度爲O(N)
private Node<AnyType> getNode(int idx, int lower, int upper) {
Node<AnyType> p;
if(idx < lower || idx > upper)
throw new IndexOutOfBoundsException();
if(idx < (size() >> 1)) {
p = beginMarker.next;
for(int i = 0; i < idx; i++)
p = p.next;
}else {
p = endMarker;
for(int i = size(); i >idx; i--)
p = p.prev;
}
return p;
}
1.4 選擇? 查詢爲主可以選擇ArrayList 頻繁更新可以選擇LinedList,
1.5 併發如何選擇? 【方法級別鎖sysnchronized】Collections.synchronizedList(), Vector,
【在新創建的數組上操作規避併發】CopyOnWriteArrayList 。