Java基礎(chǔ)教程:Java集合框架分析

Java基礎(chǔ)教程:Java集合框架分析

長(zhǎng)沙中公優(yōu)就業(yè)      2022-04-03 16:14:01     8

Java基礎(chǔ)教程:Java集合框架分析,  二:框架分析  (0)點(diǎn)線框表示接口,實(shí)線框表示具體的類。 ?。?)常用的List、Set、Queue、Map都屬于集合類。前三個(gè)都

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹



  二:框架分析


 ?。?)點(diǎn)線框表示接口,實(shí)線框表示具體的類。


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


 ?。?)List不僅可以生成普通的Iterator(因?yàn)槔^承自Collection),還能生成ListIterator。


 ?。?)常用的類ArrayList、linkedList、HashSet、HashMap。這幾個(gè)類請(qǐng)好好研讀JDK源碼


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


  三:容器分析


 ?。?)ArrayList


  (1.1)底層使用一個(gè)Object數(shù)組來(lái)實(shí)現(xiàn)。get和set操作基于這個(gè)數(shù)組。


 ?。?.2)List在遍歷的時(shí)候,如果被修改了會(huì)拋出java.util.ConcurrentModificationException異常。


 ?。?)linkedList


  底層采用采用一個(gè)first和last的Node<E>節(jié)點(diǎn),通過鏈表來(lái)實(shí)現(xiàn)。


 ?。?)Hashmap


  (3.1)底層采用Node<K,V>[]table的數(shù)組+鏈表的形式來(lái)實(shí)現(xiàn)。


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


  (3.3)是線程不安全的。


  (4)HashSet


  底層采用HashMap來(lái)實(shí)現(xiàn)。


  其中value使用privatestaticfinalObjectPRESENT=newObject()來(lái)表示。


 ?。?)CopyOnWriteArrayList


  (5.1)底層數(shù)據(jù)結(jié)構(gòu)


  finaltransientReentrantLocklock=newReentrantLock();


  privatetransientvolatileObject[]array;


 ?。?.2)基本操作


  get(intindex)操作直接取數(shù)組對(duì)應(yīng)的元素。


  set(intindex,Eelement)操作按如下步驟:


  調(diào)用lock.lock()


  取index處對(duì)應(yīng)的元素oldValue


  如果oldValue和element不等,則復(fù)制原數(shù)組,然后設(shè)置index處的值為element,最后原數(shù)組指向新數(shù)組。


  如果相等,原數(shù)組還是指向原數(shù)組。


  lock.unlock()


 ?。?)TreeMap


 ?。?.1)繼承自AbstractMap<K,V>,實(shí)現(xiàn)了NavigableMap<K,V>


 ?。?.2)底層使用紅黑樹實(shí)現(xiàn),有一個(gè)比較器來(lái)比較元素的排列順序,元素是有序的。


 ?。?.3)key不能為NULL,value可以為NULL。key不能為null是因?yàn)閗ey之間需要比較大小。


  (7)TreeSet


  底層使用TreeMap來(lái)實(shí)現(xiàn)。


  (8)HashTable


 ?。?.1)put和get方法都用synchronized修飾


 ?。?.2)底層是Entry<?,?>[]table,也是數(shù)組+鏈表的形式來(lái)實(shí)現(xiàn)。


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


 ?。?)linkedHashMap


 ?。?.1)繼承自HashMap,增加了一個(gè)額外的雙向鏈表維護(hù)key插入和訪問的有序性。


  (9.2)內(nèi)部的Entry<K,V>基礎(chǔ)自HashMap.Node<K,V>,并增加了兩個(gè)節(jié)點(diǎn):Entry<K,V>before,after。


 ?。?.3)包含linkedHashMap.Entry<K,V>head和linkedHashMap.Entry<K,V>tail。


 ?。?.4)key和value都可以為null。


 ?。?0)ConcurrentHashMap


  (10.1)JDK6和JDK7中采用分段鎖的設(shè)計(jì)。采用segment數(shù)組和HashEntry數(shù)組的數(shù)據(jù)結(jié)構(gòu)組成,segment是一種可重入鎖ReentrantLock。默認(rèn)segment數(shù)組大小為16。



  (10.2)是否需要擴(kuò)容:在插入元素之前,會(huì)判斷Segment里的HashEntry數(shù)組是否超過閾值(threshold)。如果超過閥值,則需要進(jìn)行擴(kuò)容。而HashMap是put后才判斷。


  (10.3)如何擴(kuò)容:ConcurrentHashMap擴(kuò)容不是針對(duì)整個(gè)容器,而是針對(duì)Segment。新創(chuàng)建的HashEntry數(shù)組大小是原來(lái)的兩倍。


  (10.4)put操作步驟


  為key做Hash運(yùn)算,得到hash值。


  通過hash值,定位到具體的Segment對(duì)象


  獲取可重入鎖


  再次通過hash值,定位到Segment中HashEntry數(shù)組的具體位置。


  插入或覆蓋HashEntry對(duì)象。


  釋放鎖。



      以上就是長(zhǎng)沙中公優(yōu)就業(yè)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java基礎(chǔ)教程:Java集合框架分析”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。


Java入門教程

培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。