4. ArrayList和LinkedList有什麼區別

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 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章