1. 程式人生 > >ArrayList、LinkedList和Vector三者的異同

ArrayList、LinkedList和Vector三者的異同

List子介面:儲存有序的、可重複的資料----->“動態”陣列,注意:此處不是真正的動態陣列

    **ArrayList:作為List的主要實現類;主要特點有執行緒不安全,但是執行效率高效,底層實現是陣列結構(Collections中定義了synchronizedList(List list)將此ArrayList轉化為執行緒安全的)

    **LinkedList:對於頻繁的插入、刪除操作,我們建議使用此類,因為它的執行效率高;但是記憶體消耗比ArrayList大;底層實現的雙向連結串列實現

    **Vector:List的古老實現類;執行緒安全的,效率低;底層使用陣列實現的(如今逐漸被淘汰)


    ArrayList原始碼分析:
        jdk7:
            ArrayList list = new ArrayList();//初始化一個長度為10的Object[] elementData
            System.our.println(list.size());//返回儲存的元素的個數:0
            list.add(123);
            list.add(456);
            ...

            當新增第11個元素時,需要擴容,預設擴容為原來的1.5倍。還需要將原有陣列中的資料複製到新的陣列中。
            刪除操作:如果刪除某一個數組位置的元素,需要其後面的元素依次前移。
            remove(Object obj)/remove(int index)


        jdk8:
            ArrayList list = new ArrayList();//初始化一個長度為0的Object[] elementData
            System.our.println(list.size());//返回儲存的元素的個數:0
            list.add(123);//此時才建立一個長度為10的Object[] elementData
            list.add(456);
            ...

            當新增第11個元素時,需要擴容,預設擴容為原來的1.5倍。還需要將原有陣列中的資料複製到新的陣列中。

        實際開發中的啟示:
            1.建議使用:ArrayList list = new ArrayList(int length);
            2.jdk8延遲了底層陣列的建立:記憶體的使用率;物件的建立更快(jdk7為餓漢式,jdk8為懶漢式)


    LinkedList原始碼分析:
        LinkedList:底層使用雙向連結串列存新增的元素
        void linkLast(E e){
            final Node<E> l = last;
            final Node<E> newNode = new Node<>(l, e, null);
            last = new Node;
            if(l == null){
                first = new Node;
            }else{
                l.next = new Node;
            }
            size++;
            modCount++;
        }

        內部類體現:
        private static class Node<E>{
            E item;
            Node<E> next;
            Node<E> prev;
        }

    拓展1:LinkedHashMap原始碼分析
        LinkedHashMap繼承於HashMap,在HashMap底層結構的基礎上額外新增一對連結串列:
            static class Entry<K, V> extends HashMap.Node<K, V>{
                Entry<K, V> before, after;
            }