1.深入理解java集合List


下圖是java集合框架圖,Collection、Map是集合框架的頂級類,Iterator是集合迭代器。

Collection介紹(主要講解實現類,主要特點,適用場景,實現原理)
1、List接口,主要實現類Vector、ArrayList、LinkedList
    (1)Vector  ,如下圖源碼結構,可以看出Vector主要有3個成員變量,elementData是Vector 保存數據的數組成員,elementCount:記錄Vector 當前容量,capacityIncrement擴容增量
     
    
    特點原理: Vector  底層是使用數組保存元素,因此隨機訪問非常迅速,但隨機插入和刪除元素卻要移動元素,Vector  使用本地方法System.arraycopy移動數組元素,新增元素時如果當前數組空間不足,則自動擴容以保證足夠的空間存儲元素,Vector每個操作方法都指定了synchronized關鍵字,因此Vector的操作時線程安全的。
    適用場景:Vector 的適用於讀多寫少,線程安全的業務場景。
    (2)ArrayList,ArrayList和Vector非常相似,區別僅僅是ArrayList操作方法不是線程安全的,要把非線程安全的arraylist轉變線程安全可以使用Collections.synchronizedList方法
    適用場景:ArrayList的適用於讀多寫少,線程非安全的業務場景。
    (3)LinkedList,List的鏈表實現,如下圖源碼結構,可以看出LinkedList主要有3個成員變量,size:鏈表大小,first:是鏈表開始節點,last:是鏈表尾部節點。
   
    那LinkedList元素保存在那裏呢?內部使用靜態內部類Node<E>來保存數組元素,看下面代碼:
    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
    通過代碼可以看到,LinkedList節點類Node<E>包含了元素E,以及節點的前一個和後一個元素的引用。下面我們看看LinkedList讀取,新增,刪除元素時的操作
    (1)讀取一個元素,當讀取第一個和最後一個元素時,直接返回first,last節點的成員變量E的值即可,當隨機獲取一個元素時,LinkedList通過 Node<E> node(int index){}方法找到指定位置index元素節點,      
      具體實現代碼如下:
    Node<E> node(int index) {
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }
    可以看到LinkedList查找元素必須遍歷節點元素,當index < (size >> 1)也就是size/2時,從first開始遍歷,否則從last遍歷,這樣一定程度上可以減少遍歷次數。
    (2)新增元素,當新增到鏈表頭和鏈表尾時,直接改變元素前後指針即可,當隨機添加元素到任意位置時,代碼如下:
    public void add(int index, E element) {
        checkPositionIndex(index); //檢查index是否合法
        //判斷index是否在鏈表尾
        if (index == size)
            linkLast(element);
        else
            linkBefore(element, node(index));//node()方法定位index元素位置,找到index位置元素,添加新的元素
    }
    LinkedList隨機新增元素也是要遍歷鏈表,當鏈表較大時性能比較差。
    (3)刪除元素,同樣刪除鏈表頭和鏈表尾時,直接改變元素前後指針即可,當隨機刪除元素到任意位置時,代碼如下:
    public E remove(int index) {
        checkElementIndex(index);//檢查index是否合法
        return unlink(node(index));//node()方法定位index元素位置,找到index位置元素,刪除元素
    }
    特點原理:集合元素無上限,集合使用Node<E>類保存元素E,讀取,新增,刪除鏈表頭和尾效率非常快。隨機讀取,新增,刪除鏈表頭和尾效率較差!
    適用場景:順序讀取,新增,刪除場景,不適合隨機讀寫,線程不安全。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章