日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java集合的小抄 Java初學者必備

瀏覽:229日期:2022-09-06 08:10:23

在盡可能短的篇幅里,將所有集合與并發(fā)集合的特征,實現方式,性能捋一遍。適合所有"精通Java"其實還不那么自信的人閱讀。

 List

ArrayList

以數組實現。節(jié)約空間,但數組有容量限制。超出限制時會增加50%容量,用System.arraycopy()復制到新的數組,因此最好能給出數組大小的預估值。默認第一次插入元素時創(chuàng)建大小為10的數組。

按數組下標訪問元素--get(i)/set(i,e) 的性能很高,這是數組的基本優(yōu)勢。

直接在數組末尾加入元素--add(e)的性能也高,但如果按下標插入、刪除元素--add(i,e), remove(i), remove(e),則要用System.arraycopy()來移動部分受影響的元素,性能就變差了,這是基本劣勢。

LinkedList

以雙向鏈表實現。鏈表無容量限制,但雙向鏈表本身使用了更多空間,也需要額外的鏈表指針操作。

按下標訪問元素--get(i)/set(i,e) 要悲劇的遍歷鏈表將指針移動到位(如果i>數組大小的一半,會從末尾移起)。

插入、刪除元素時修改前后節(jié)點的指針即可,但還是要遍歷部分鏈表的指針才能移動到下標所指的位置,只有在鏈表兩頭的操作--add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指針的移動。

CopyOnWriteArrayList

并發(fā)優(yōu)化的ArrayList。用CopyOnWrite策略,在修改時先復制一個快照來修改,改完再讓內部指針指向新數組。

因為對快照的修改對讀操作來說不可見,所以只有寫鎖沒有讀鎖,加上復制的昂貴成本,典型的適合讀多寫少的場景。如果更新頻率較高,或數組較大時,還是Collections.synchronizedList(list),對所有操作用同一把鎖來保證線程安全更好。

增加了addIfAbsent(e)方法,會遍歷數組來檢查元素是否已存在,性能可想像的不會太好。

補充

無論哪種實現,按值返回下標--contains(e), indexOf(e), remove(e) 都需遍歷所有元素進行比較,性能可想像的不會太好。

沒有按元素值排序的SortedList,在線程安全類中也沒有無鎖算法的ConcurrentLinkedList,湊合著用Set與Queue中的等價類時,會缺少一些List特有的方法。

 Map

HashMap

以Entry[]數組實現的哈希桶數組,用Key的哈希值取模桶數組的大小可得到數組下標。

插入元素時,如果兩條Key落在同一個桶(比如哈希值1和17取模16后都屬于第一個哈希桶),Entry用一個next屬性實現多個Entry以單向鏈表存放,后入桶的Entry將next指向桶當前的Entry。

查找哈希值為17的key時,先定位到第一個哈希桶,然后以鏈表遍歷桶里所有元素,逐個比較其key值。

當Entry數量達到桶數量的75%時(很多文章說使用的桶數量達到了75%,但看代碼不是),會成倍擴容桶數組,并重新分配所有原來的Entry,所以這里也最好有個預估值。

取模用位運算(hash & (arrayLength-1))會比較快,所以數組的大小永遠是2的N次方, 你隨便給一個初始值比如17會轉為32。默認第一次放入元素時的初始值是16。

iterator()時順著哈希桶數組來遍歷,看起來是個亂序。

在JDK8里,新增默認為8的閥值,當一個桶里的Entry超過閥值,就不以單向鏈表而以紅黑樹來存放以加快Key的查找速度。

LinkedHashMap

擴展HashMap增加雙向鏈表的實現,號稱是最占內存的數據結構。支持iterator()時按Entry的插入順序來排序(但是更新不算, 如果設置accessOrder屬性為true,則所有讀寫訪問都算)。

實現上是在Entry上再增加屬性before/after指針,插入時把自己加到Header Entry的前面去。如果所有讀寫訪問都要排序,還要把前后Entry的before/after拼接起來以在鏈表中刪除掉自己。

TreeMap

以紅黑樹實現,篇幅所限詳見入門教程。支持iterator()時按Key值排序,可按實現了Comparable接口的Key的升序排序,或由傳入的Comparator控制。可想象的,在樹上插入/刪除元素的代價一定比HashMap的大。

支持SortedMap接口,如firstKey(),lastKey()取得最大最小的key,或sub(fromKey, toKey), tailMap(fromKey)剪取Map的某一段。

ConcurrentHashMap

并發(fā)優(yōu)化的HashMap,默認16把寫鎖(可以設置更多),有效分散了阻塞的概率,而且沒有讀鎖。

數據結構為Segment[],Segment里面才是哈希桶數組,每個Segment一把鎖。Key先算出它在哪個Segment里,再算出它在哪個哈希桶里。

支持ConcurrentMap接口,如putIfAbsent(key,value)與相反的replace(key,value)與以及實現CAS的replace(key, oldValue, newValue)。

沒有讀鎖是因為put/remove動作是個原子動作(比如put是一個對數組元素/Entry 指針的賦值操作),讀操作不會看到一個更新動作的中間狀態(tài)。

ConcurrentSkipListMap

JDK6新增的并發(fā)優(yōu)化的SortedMap,以SkipList實現。SkipList是紅黑樹的一種簡化替代方案,是個流行的有序集合算法,篇幅所限見入門教程。Concurrent包選用它是因為它支持基于CAS的無鎖算法,而紅黑樹則沒有好的無鎖算法。

很特殊的,它的size()不能隨便調,會遍歷來統(tǒng)計。

補充

關于null,HashMap和LinkedHashMap是隨意的,TreeMap沒有設置Comparator時key不能為null;ConcurrentHashMap在JDK7里value不能為null(這是為什么呢?),JDK8里key與value都不能為null;ConcurrentSkipListMap是所有JDK里key與value都不能為null。

 Set

Set幾乎都是內部用一個Map來實現, 因為Map里的KeySet就是一個Set,而value是假值,全部使用同一個Object。Set的特征也繼承了那些內部Map實現的特征。

HashSet:內部是HashMap。

LinkedHashSet:內部是LinkedHashMap。

TreeSet:內部是TreeMap的SortedSet。

ConcurrentSkipListSet:內部是ConcurrentSkipListMap的并發(fā)優(yōu)化的SortedSet。

CopyOnWriteArraySet:內部是CopyOnWriteArrayList的并發(fā)優(yōu)化的Set,利用其addIfAbsent()方法實現元素去重,如前所述該方法的性能很一般。

補充:好像少了個ConcurrentHashSet,本來也該有一個內部用ConcurrentHashMap的簡單實現,但JDK偏偏沒提供。Jetty就自己封了一個,Guava則直接用java.util.Collections.newSetFromMap(new ConcurrentHashMap()) 實現。

 Queue

Queue是在兩端出入的List,所以也可以用數組或鏈表來實現。

--普通隊列--

LinkedList

是的,以雙向鏈表實現的LinkedList既是List,也是Queue。它是唯一一個允許放入null的Queue。

ArrayDeque

以循環(huán)數組實現的雙向Queue。大小是2的倍數,默認是16。

普通數組只能快速在末尾添加元素,為了支持FIFO,從數組頭快速取出元素,就需要使用循環(huán)數組:有隊頭隊尾兩個下標:彈出元素時,隊頭下標遞增;加入元素時,如果已到數組空間的末尾,則將元素循環(huán)賦值到數組[0](如果此時隊頭下標大于0,說明隊頭彈出過元素,有空位),同時隊尾下標指向0,再插入下一個元素則賦值到數組[1],隊尾下標指向1。如果隊尾的下標追上隊頭,說明數組所有空間已用完,進行雙倍的數組擴容。

PriorityQueue

用二叉堆實現的優(yōu)先級隊列,詳見入門教程,不再是FIFO而是按元素實現的Comparable接口或傳入Comparator的比較結果來出隊,數值越小,優(yōu)先級越高,越先出隊。但是注意其iterator()的返回不會排序。

--線程安全的隊列--

ConcurrentLinkedQueue/ConcurrentLinkedDeque

無有暗香盈袖界的并發(fā)優(yōu)化的Queue,基于鏈表,實現了依賴于CAS的無鎖算法。

ConcurrentLinkedQueue的結構是單向鏈表和head/tail兩個指針,因為入隊時需要修改隊尾元素的next指針,以及修改tail指向新入隊的元素兩個CAS動作無法原子,所以需要的特殊的算法,篇幅所限見入門教程。

PriorityBlockingQueue

無有暗香盈袖界的并發(fā)優(yōu)化的PriorityQueue,也是基于二叉堆。使用一把公共的讀寫鎖。雖然實現了BlockingQueue接口,其實沒有任何阻塞隊列的特征,空間不夠時會自動擴容。

DelayQueue

內部包含一個PriorityQueue,同樣是無有暗香盈袖界的。元素需實現Delayed接口,每次調用時需返回當前離觸發(fā)時間還有多久,小于0表示該觸發(fā)了。pull()時會用peek()查看隊頭的元素,檢查是否到達觸發(fā)時間。ScheduledThreadPoolExecutor用了類似的結構。

--線程安全的阻塞隊列--

BlockingQueue的隊列長度受限,用以保證生產者與消費者的速度不會相差太遠,避免內存耗盡。隊列長度設定后不可改變。當入隊時隊列已滿,或出隊時隊列已空,不同函數的效果見下表:

可能報異常返回布爾值可能阻塞等待可設定等待時間入隊add(e)offer(e)put(e)offer(e, timeout, unit)出隊remove()poll()take()poll(timeout, unit)查看element()peek()無無

ArrayBlockingQueue

定長的并發(fā)優(yōu)化的BlockingQueue,基于循環(huán)數組實現。有一把公共的讀寫鎖與notFull、notEmpty兩個Condition管理隊列滿或空時的阻塞狀態(tài)。

LinkedBlockingQueue/LinkedBlockingDeque

可選定長的并發(fā)優(yōu)化的BlockingQueue,基于鏈表實現,所以可以把長度設為Integer.MAX_VALUE。利用鏈表的特征,分離了takeLock與putLock兩把鎖,繼續(xù)用notEmpty、notFull管理隊列滿或空時的阻塞狀態(tài)。

補充

JDK7有個LinkedTransferQueue,transfer(e)方法保證Producer放入的元素,被Consumer取走了再返回,比SynchronousQueue更好,有空要學習下。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美+亚洲+精品+三区| 久热综合在线亚洲精品| 午夜影院欧美| 国产精品资源| 老牛国产精品一区的观看方式| 欧美sm一区| 精品三区视频| 麻豆精品国产91久久久久久| 久久不见久久见中文字幕免费| 清纯唯美亚洲综合一区| 亚洲影视一区| 天海翼亚洲一区二区三区| 日日摸夜夜添夜夜添国产精品| 蜜桃av一区二区在线观看| 亚洲欧美日韩高清在线| 国产一区国产二区国产三区| 国产精品白丝av嫩草影院| 国产一区视频在线观看免费| 蜜桃视频在线观看一区| 伊人久久大香线蕉av不卡| 久久精品国产精品亚洲毛片| 91精品视频一区二区| 亚洲国产专区校园欧美| 精品国产黄a∨片高清在线| 999久久久国产精品| 欧美亚洲三级| 国产精品亚洲产品| 久久精品免视看国产成人| 国产精品极品在线观看| 久久精品午夜| 一本大道色婷婷在线| 欧美亚洲精品在线| 群体交乱之放荡娇妻一区二区| 欧美国产另类| 9999国产精品| 欧美一区二区性| 亚洲一区欧美二区| 91欧美精品| 91精品丝袜国产高跟在线| 国产亚洲高清一区| 日韩av一区二| 国产日本精品| 蜜桃精品视频| 超碰成人av| 亚洲欧洲美洲av| 香蕉久久精品| 在线精品亚洲| 国产精品一区二区免费福利视频 | 男人的天堂久久精品| 日本精品另类| 国产一区二区三区不卡视频网站 | 国产精品女主播一区二区三区| 日本综合精品一区| 精品欠久久久中文字幕加勒比| 国产字幕视频一区二区| 亚洲欧美一级| 国产一区丝袜| 麻豆国产欧美一区二区三区| 红杏一区二区三区| 色综合狠狠操| 首页亚洲欧美制服丝腿| 日韩综合一区二区| 欧美一级二级三级视频| 亚洲视频国产| 国产精品巨作av| 日韩视频一二区| 黄色在线网站噜噜噜| 精品一区二区三区亚洲| 色在线中文字幕| 欧美日韩亚洲国产精品| 亚洲人www| 国产伊人久久| 日韩高清一区在线| 久久97视频| 成人羞羞在线观看网站| 秋霞国产精品| 99热精品久久| 亚洲免费一区二区| 亚洲专区视频| 国产精品1luya在线播放| 国产999精品在线观看| 国产精品国产一区| 人在线成免费视频| 91精品观看| 亚洲人妖在线| 国产色综合网| 久久福利影视| 精品三区视频| 好看的av在线不卡观看| 精品视频在线观看网站| 亚洲精品欧美| 欧美日韩精品一本二本三本| 香蕉国产精品| 国产不卡精品在线| 欧美日韩在线网站| 欧美日韩少妇| 乱一区二区av| 国产精品夜夜夜| 欧美国产小视频| 激情久久婷婷| 日韩精品中文字幕吗一区二区| 国产精品免费精品自在线观看| 福利精品在线| 精品丝袜在线| 久久久夜精品| 亚洲精品高潮| 国产精品网址| 亚洲精品少妇| 好看不卡的中文字幕| 欧美精品观看| 福利视频一区| 亚洲免费在线| 久久国产精品亚洲77777| 久久97久久97精品免视看秋霞| 国产丝袜一区| 日本欧美在线| 成人午夜网址| 亚洲高清激情| 日本在线观看不卡视频| 日本成人中文字幕在线视频| 精品国产18久久久久久二百| 亚洲免费高清| 欧美成a人片免费观看久久五月天| 成人精品中文字幕| 蜜桃一区二区三区在线| 欧美极品中文字幕| 精品一区二区三区亚洲| 日韩欧美中文字幕电影| а√天堂中文在线资源8| 日韩一级精品| 国产精品红桃| 国产黄大片在线观看| 欧美日韩国产在线一区| 欧美日韩一区自拍| 国产精品一线天粉嫩av| 国内精品伊人| 国产一区二区三区国产精品| 日韩中文视频| 国产精品一区二区中文字幕| 在线亚洲欧美| 精品视频91| 中文字幕av一区二区三区四区| 日韩精品免费观看视频| 亚洲日本欧美| 国产成人精品一区二区三区在线| 国产99久久久国产精品成人免费| 亚洲在线网站| 国产精久久久| 尤物tv在线精品| 国产精品日韩久久久| 美女视频免费精品| 日韩1区2区日韩1区2区| 国产精品白丝一区二区三区| 99精品国产一区二区三区| 欧美久久一区二区三区| 日韩中文欧美在线| 丝袜美腿一区| 国产精品一区二区精品视频观看 | 日韩一区二区三区免费播放| 亚洲狼人精品一区二区三区| 久久一区视频| 国产日产精品_国产精品毛片| 欧美三级网址| 国产精品一区二区三区av| 久久精品国产福利| 欧美日韩一区自拍| 亚洲tv在线| 亚洲精品一级二级三级| 91高清一区| 一区二区三区四区日韩| 国精品一区二区三区| 日韩一区精品视频| 欧美日韩夜夜| 亚洲www啪成人一区二区| 日本在线不卡视频一二三区| 蜜桃久久久久| 日日摸夜夜添夜夜添国产精品| 日韩免费一区| 欧美国产91| 欧美在线黄色| 日韩二区在线观看| 精品欧美日韩精品| 日韩一区二区三区四区五区| 国产精品亚洲欧美一级在线| 亚洲欧美日韩国产一区| 精品国产乱码久久久| 国产情侣一区在线| 麻豆精品蜜桃| 蜜桃av.网站在线观看| 日本不卡不码高清免费观看| 精品黄色一级片| 国产探花在线精品一区二区| 欧美精品羞羞答答| 日韩美女精品| 综合亚洲色图| 婷婷综合五月| 99免费精品| 三级精品视频| 国产字幕视频一区二区| 久久九九精品|