1. 程式人生 > >1.深入理解java集合List

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,讀取,新增,刪除連結串列頭和尾效率非常快。隨機讀取,新增,刪除連結串列頭和尾效率較差!
    適用場景:順序讀取,新增,刪除場景,不適合隨機讀寫,執行緒不安全。