關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧

關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧

ID:32677172

大小:61.30 KB

頁(yè)數(shù):6頁(yè)

時(shí)間:2019-02-14

關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧_第1頁(yè)
關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧_第2頁(yè)
關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧_第3頁(yè)
關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧_第4頁(yè)
關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧_第5頁(yè)
資源描述:

《關(guān)于java集合的小抄-java開發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。

1、關(guān)于Java集合的小抄-編程開發(fā)技術(shù)關(guān)于Java集合的小抄原文出處:花錢的年華的博客在盡可能短的篇幅里,將所冇集合與并發(fā)集合的特征,實(shí)現(xiàn)方式,性能捋一遍。適合所有”精通Java"其實(shí)還不那么口信的人閱讀。不斷更新屮,請(qǐng)盡量訪問博客原文。ListArrayList以數(shù)組實(shí)現(xiàn)。節(jié)約空間,但數(shù)組有容量限制。超出限制時(shí)會(huì)增加50%容量,用System,arraycopy()復(fù)制到新的數(shù)組,因此最好能給出數(shù)組大小的預(yù)估值。默認(rèn)第一次插入元素時(shí)創(chuàng)建大小為10的數(shù)組。按數(shù)組下標(biāo)訪問元素-get(i)/set(i,e)的性能很高,這是數(shù)組的基木優(yōu)勢(shì)。直接在

2、數(shù)組末尾加入元索-add(e)的性能也高,但如果按下標(biāo)插入、刪除元索-add(i,c),remove(i),remove(c),則要用System,arraycopy()來(lái)移動(dòng)部分受影響的元素,性能就變差了,這是基本劣勢(shì)。LinkedList以雙向鏈表實(shí)現(xiàn)。鏈表無(wú)容量限制,但雙向鏈表木身使用了更多空間,也需要額外的鏈表指針操作。按卜?標(biāo)訪問元素-gct(i)/sct(i,c)要悲劇的遍歷鏈表將指針移動(dòng)到位(如果i>數(shù)組大小的一半,會(huì)從末尾移起)。插入、刪除元素時(shí)修改前后節(jié)點(diǎn)的指針即可,但還是要遍力部分鏈表的指針才能移動(dòng)到下標(biāo)所指的位置,只有

3、在鏈表兩頭的操作-add(),addFirst(),removeLast()或用iterator()上的remove()能省掉指針的移動(dòng)。CopyOnWriteArrayList并發(fā)優(yōu)化的ArrayListo用CopyOnWrite策略,在修改時(shí)先復(fù)制一個(gè)快照來(lái)修改,改完再讓內(nèi)部指針指向新數(shù)組。因?yàn)閷?duì)快照的修改對(duì)讀操作來(lái)說不可見,所以只有寫鎖沒有讀鎖,加上復(fù)制的昂貴成本,典型的適合讀多寫少的場(chǎng)景。如果更新頻率較高,或數(shù)組較大時(shí),還是Collections.synchronizedList(list),對(duì)所冇操作用同一把鎖來(lái)保證線程安全更好。

4、增加了addlfAbsenl(e)方法,會(huì)遍歷數(shù)組來(lái)檢查元索是否已存在,性能可想像的不會(huì)太好。補(bǔ)充無(wú)論哪種實(shí)現(xiàn),按值返回卜標(biāo)-contains(e),indexOf(e),remove(e)都需遍歷所有元素進(jìn)行比較,性能可想像的不會(huì)太好。沒有按元素值排序的SortedList,在線程安全類中也沒有無(wú)鎖算法的ConcurrentLinkedList,湊合著用Set與Queue中的等價(jià)類時(shí),會(huì)缺少一些List特:有的方法。MapHashMap以Entry[]數(shù)組實(shí)現(xiàn)的哈希桶數(shù)組,用Key的哈希值取模桶數(shù)組的人小可得到數(shù)組下標(biāo)。插入元素時(shí),如果兩

5、條Key落在同一個(gè)桶(比如哈希值1和17取模16后都展于第一個(gè)哈希桶),Entry用一個(gè)next屈性實(shí)現(xiàn)多個(gè)Entry以單向鏈表存放,后入桶的Entry將next指向桶當(dāng)前的Entry。查找哈希值為17的keyII寸,先定位到第一個(gè)哈希桶,然后以鏈表遍歷桶里所有元索,逐個(gè)比較具key值。當(dāng)Entry數(shù)量達(dá)到桶數(shù)量的75%時(shí)(很多文章說使用的桶數(shù)量達(dá)到了75%,但看代碼不是),會(huì)成倍擴(kuò)容桶數(shù)組,并重新分配所有原來(lái)的Entry,所以這里也最好有個(gè)預(yù)估值。取模用位運(yùn)算(hash&(arrayLength-1))會(huì)比較快,所以數(shù)組的大小永遠(yuǎn)是2的N

6、次方,你隨便給一個(gè)初始值比如17會(huì)轉(zhuǎn)為32O默認(rèn)第一次放入元索時(shí)的初始值是16oiteratorO時(shí)順著哈希桶數(shù)組來(lái)遍丿力,看起來(lái)是個(gè)亂序。在JDK8里,新增默認(rèn)為8的閥值,當(dāng)一個(gè)桶里的Entry超過閥值,就不以單向鏈表而以紅黑樹來(lái)存放以加快Key的查找速度。LinkedHashMap擴(kuò)展HashMap增加雙向鏈表的實(shí)現(xiàn),號(hào)稱是最占內(nèi)存的數(shù)據(jù)結(jié)構(gòu)。支持iterator()時(shí)按Entry的插入順序來(lái)排序(但是更新不算,如果設(shè)置accessOrder屬性為true,則所有讀寫訪問都算)。實(shí)現(xiàn)上是在Entry上再増加屬性before/after指

7、針,插入時(shí)把自己加到HeaderEntry的前而去。如果所有讀寫訪問都要排序,還要把前后Entry的before/after拼接起來(lái)以在鏈表屮刪除掉自己。TreeMap以紅黑樹實(shí)現(xiàn),篇幅所限詳見入門教程。支持iterator()吋按Key值排序,可按實(shí)現(xiàn)了Comparable接口的Key的升序排序,或由傳入的Comparator控制??上胂蟮?,在樹上插入/刪除元素的代價(jià)一定比HashMap的大。支持SortedMap接口,如firstKey(),lastKey()取得最大最小的key,或sub(fromKey,toKey),ta訂Map(f

8、romKey)剪取Map的某一段。ConcurrentHashMap并發(fā)優(yōu)化的HashMap,默認(rèn)16把寫鎖(可以設(shè)置更多),有效分散了阻塞的概率,而且沒有讀鎖。數(shù)據(jù)結(jié)構(gòu)為Seg

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。