Java之集合架構匯總分析

來源:互聯網
上載者:User

標籤:源碼   str   1.2   hashcode   volatile   .com   ble   需要   jdk6   

一:架構圖

 

二:架構分析

(0)點線框表示介面,實線框表示具體的類。

(1)常用的List、Set、Queue、Map都屬於集合類。前三個都是繼承自Collection,但是Map不是。

(2)List不僅可以產生普通的Iterator(因為繼承自Collection),還能產生ListIterator。

(3)常用的類ArrayList、LinkedList、HashSet、HashMap。這幾個類請好好研讀JDK源碼

(4)其它需要好好掌握的容器:CopyOnWriteArrayList、TreeSet、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap。

 

三:容器分析

(1)ArrayList

(1.1)底層使用一個Object數組來實現。get和set操作基於這個數組。

(1.2)List在遍曆的時候,如果被修改了會拋出java.util.ConcurrentModificationException異常。

 

(2)LinkedList

底層採用採用一個first和last的Node<E>節點,通過鏈表來實現。

 

(3)Hashmap

(3.1)底層採用Node<K,V>[] table 的數組+鏈表的形式來實現。

(3.2)key和value都可以為NULL。

(3.3)是線程不安全的。

 

(4)HashSet

底層採用HashMap來實現。

其中value使用private static final Object PRESENT = new Object()來表示。

 

(5)CopyOnWriteArrayList

(5.1)底層資料結構

final transient ReentrantLock lock = new ReentrantLock();

private transient volatile Object[] array;

(5.2)基本操作

get(int index)操作直接取數組對應的元素。

set(int index, E element) 操作按如下步驟:

  • 調用lock.lock()
  • 取index處對應的元素oldValue
  • 如果oldValue和element不等,則複製原數組,然後設定index處的值為element,最後原數組指向新數組。
  • 如果相等,原數組還是指向原數組。
  • lock.unlock()

 

(6)TreeMap

(6.1)繼承自AbstractMap<K,V>,實現了NavigableMap<K,V>

(6.2)底層使用紅/黑樹狀結構實現,有一個比較子來比較元素的排列順序,元素是有序的。

(6.3)key不能為NULL,value可以為NULL。key不能為null是因為key之間需要比較大小。

 

(7)TreeSet

底層使用TreeMap來實現。

 

(8)HashTable

(8.1)put和get方法都用synchronized修飾

(8.2)底層是Entry<?,?>[] table,也是數組+鏈表的形式來實現。

(8.3)put操作中會檢查value是否為null,是則拋出NullPointerException。put操作中會調用key.hashCode(),所以key不能為null。綜上,key和value都不能為null。

 

(9)LinkedHashMap

(9.1)繼承自HashMap,增加了一個額外的雙向鏈表維護key插入和訪問的有序性。

(9.2)內部的Entry<K,V>基礎自HashMap.Node<K,V>,並增加了兩個節點: Entry<K,V> before, after。

(9.3)包含LinkedHashMap.Entry<K,V> head和LinkedHashMap.Entry<K,V> tail。

(9.4)key和value都可以為null。

 

(10)ConcurrentHashMap

(10.1)JDK6和JDK7中採用分段鎖的設計。採用segment數組和HashEntry數組的資料結構組成,segment是一種可重新進入鎖ReentrantLock。預設segment數組大小為16。

 

(10.2)是否需要擴容:在插入元素之前,會判斷Segment裡的HashEntry數組是否超過閾值(threshold)。如果超過閥值,則需要進行擴容。而HashMap是put後才判斷。

(10.3)如何擴容:ConcurrentHashMap擴容不是針對整個容器,而是針對Segment。新建立的HashEntry數組大小是原來的兩倍。

(10.4)put操作步驟

  • 為key做Hash運算,得到hash值。
  • 通過hash值,定位到具體的Segment對象
  • 擷取可重新進入鎖
  • 再次通過hash值,定位到Segment中HashEntry數組的具體位置。
  • 插入或覆蓋HashEntry對象。
  • 釋放鎖。

(10.5)JDK8之後使用CAS演算法

Java之集合架構匯總分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.