更新時間:2020-03-02 16:58:25 來源:動力節(jié)點 瀏覽2562次

二:框架分析
?。?)點線框表示接口,實線框表示具體的類。
(1)常用的List、Set、Queue、Map都屬于集合類。前三個都是繼承自Collection,但是Map不是。
(2)List不僅可以生成普通的Iterator(因為繼承自Collection),還能生成ListIterator。
(3)常用的類ArrayList、LinkedList、HashSet、HashMap。這幾個類請好好研讀JDK源碼
?。?)其它需要好好掌握的容器:CopyOnWriteArrayList、TreeSet、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap。
三:容器分析
?。?)ArrayList
?。?.1)底層使用一個Object數(shù)組來實現(xiàn)。get和set操作基于這個數(shù)組。
?。?.2)List在遍歷的時候,如果被修改了會拋出java.util.ConcurrentModificationException異常。
?。?)LinkedList
底層采用采用一個first和last的Node<E>節(jié)點,通過鏈表來實現(xiàn)。
?。?)Hashmap
?。?.1)底層采用Node<K,V>[]table的數(shù)組+鏈表的形式來實現(xiàn)。
?。?.2)key和value都可以為NULL。
?。?.3)是線程不安全的。
(4)HashSet
底層采用HashMap來實現(xiàn)。
其中value使用privatestaticfinalObjectPRESENT=newObject()來表示。
?。?)CopyOnWriteArrayList
(5.1)底層數(shù)據(jù)結構
finaltransientReentrantLocklock=newReentrantLock();
privatetransientvolatileObject[]array;
?。?.2)基本操作
get(intindex)操作直接取數(shù)組對應的元素。
set(intindex,Eelement)操作按如下步驟:
調(diào)用lock.lock()
取index處對應的元素oldValue
如果oldValue和element不等,則復制原數(shù)組,然后設置index處的值為element,最后原數(shù)組指向新數(shù)組。
如果相等,原數(shù)組還是指向原數(shù)組。
lock.unlock()
?。?)TreeMap
?。?.1)繼承自AbstractMap<K,V>,實現(xiàn)了NavigableMap<K,V>
?。?.2)底層使用紅黑樹實現(xiàn),有一個比較器來比較元素的排列順序,元素是有序的。
(6.3)key不能為NULL,value可以為NULL。key不能為null是因為key之間需要比較大小。
?。?)TreeSet
底層使用TreeMap來實現(xiàn)。
?。?)HashTable
?。?.1)put和get方法都用synchronized修飾
?。?.2)底層是Entry<?,?>[]table,也是數(shù)組+鏈表的形式來實現(xiàn)。
(8.3)put操作中會檢查value是否為null,是則拋出NullPointerException。put操作中會調(diào)用key.hashCode(),所以key不能為null。綜上,key和value都不能為null。
?。?)LinkedHashMap
?。?.1)繼承自HashMap,增加了一個額外的雙向鏈表維護key插入和訪問的有序性。
?。?.2)內(nèi)部的Entry<K,V>基礎自HashMap.Node<K,V>,并增加了兩個節(jié)點:Entry<K,V>before,after。
(9.3)包含LinkedHashMap.Entry<K,V>head和LinkedHashMap.Entry<K,V>tail。
(9.4)key和value都可以為null。
(10)ConcurrentHashMap
?。?0.1)JDK6和JDK7中采用分段鎖的設計。采用segment數(shù)組和HashEntry數(shù)組的數(shù)據(jù)結構組成,segment是一種可重入鎖ReentrantLock。默認segment數(shù)組大小為16。

(10.2)是否需要擴容:在插入元素之前,會判斷Segment里的HashEntry數(shù)組是否超過閾值(threshold)。如果超過閥值,則需要進行擴容。而HashMap是put后才判斷。
?。?0.3)如何擴容:ConcurrentHashMap擴容不是針對整個容器,而是針對Segment。新創(chuàng)建的HashEntry數(shù)組大小是原來的兩倍。
?。?0.4)put操作步驟
為key做Hash運算,得到hash值。
通過hash值,定位到具體的Segment對象
獲取可重入鎖
再次通過hash值,定位到Segment中HashEntry數(shù)組的具體位置。
插入或覆蓋HashEntry對象。
釋放鎖。

以上就是動力節(jié)點Java培訓機構小編介紹的“Java基礎教程:Java集合框架分析”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。