隨筆 - 22, 文章 - 0, 評論 - 1, 引用 - 0

          導(dǎo)航

          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿

          隨筆分類(20)

          隨筆檔案(22)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          java集合框架印象

          http://docs.oracle.com/javase/6/docs/technotes/guides/collections/overview.html
          集合框架層次上比較復(fù)雜,網(wǎng)上有無數(shù)文字和圖片來說明,這里按我的思路整理了一下:
          省略了AbstractCollection,AbstractList等層次的抽象類
          省略了RoleList等javax包中的應(yīng)用方向的實(shí)現(xiàn)
          省略了Vector,Stack,HashTable這些著名的老家伙。
          按照我的一般認(rèn)識進(jìn)行歸類,例如LinkedList同時實(shí)現(xiàn)了Deque和List,這里歸入List中;再例如Deque本應(yīng)繼承自Queue,但這里放在同一個級別上。
          一切都是為了盡可能建立一個較清晰的第一印象,知道該在什么場景下使用什么類。
          -------------------------------------------------
          Collection 集合接口(傳統(tǒng)包util)
          Queue 隊(duì)列
          PriorityQueue 無界優(yōu)先級隊(duì)列
          Deque 雙端隊(duì)列
          ArrayDeque 基于數(shù)組的無界雙端隊(duì)列,做隊(duì)列和棧都很合適
          List 有序集合
          ArrayList 基于數(shù)組的有序集合
          LinkedList 基于鏈表的有序結(jié)合(其實(shí)也是一個Deque)
          Set
          EnumSet 枚舉專用的set,效率高
          HashSet 基本的快速哈希Set,基于HashMap
          LinkedHashSet 附加了鏈表的哈希Set,插入慢,迭代快,有序
          TreeSet 插入時就維持順序,基于TreeMap實(shí)現(xiàn),可快速獲取子集
          總結(jié):
          棧和隊(duì)列,用ArrayDeque或者linkedList(各有千秋);其余類的適應(yīng)范圍都比較明確。
          -------------------------------------------------
          Collection 集合接口(并發(fā)包c(diǎn)oncurrent)
          Queue 隊(duì)列
          ConcurrentLinkedQueue 基于鏈接節(jié)點(diǎn)的無界線程安全隊(duì)列
          BlockingQueue 阻塞隊(duì)列
          ArrayBlockingQueue 基于數(shù)組的有界阻塞隊(duì)列
          DelayQueue 無界阻塞隊(duì)列,只有在延遲期滿時才能從中提取元素
          LinkedBlockingQueue 基于鏈表的無界阻塞隊(duì)列
          PriorityBlockingQueue 帶優(yōu)先級的無界阻塞隊(duì)列
          SynchronousQueue 無容量的同步隊(duì)列,兩個線程插入與移除交替進(jìn)行
          Deque 雙端隊(duì)列
          BlockingDeque 阻塞雙端隊(duì)列
          LinkedBlockingDeque 基于鏈表的阻塞雙端隊(duì)列
          List 有序集合
          CopyOnWriteArrayList 可變操作通過底層復(fù)制來實(shí)現(xiàn),適合多讀取,少修改
          Set
          ConcurrentSkipListSet 多線程可以安全地發(fā)執(zhí)行各種操作,迭代器弱一致
          CopyOnWriteArraySet 可變操作通過底層復(fù)制來實(shí)現(xiàn),適合多讀取,少修改
          總結(jié):
          1,ConcurrentLinkedQueue與LinkedBlockingQueue:
          http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html#ixzz1seaiSLwp
          如果生產(chǎn)者與消費(fèi)者的關(guān)系是“多對多”,選LinkedBlockingQueue(阻塞方式)要快很多,代價是迭代遍歷的效率奇低。
          如果生產(chǎn)者與消費(fèi)者的關(guān)系是“一對多”或者“多對一”,選ConcurrentLinkedQueue(無等待方式)會有一定性能提升。
          2,ArrayBlockingQueue比LinkedBlockingQueue的表現(xiàn)更穩(wěn)定和更可預(yù)測,但是后者的吞吐量往往更高。
          3,List:
          CopyOnWriteArrayList貌似只適合“多讀取,少寫入”的場景,其余情況還是乖乖的Collections.synchronizedList()吧。
          4,Set:
          ConcurrentSkipListSet可以當(dāng)作并發(fā)版的TreeSet。
          CopyOnWriteArraySet可以當(dāng)作并發(fā)版的linkedHashSet,適合多讀取,少修改。
          奇怪的是java沒有提供ConcurrentHashSet,按理說基于ConcurrentHashMap可以實(shí)現(xiàn)的。
          讀寫都頻繁的同步Set只能湊合了,用ConcurrentSkipListSet可能比synchronizedSet要強(qiáng)?
          http://dhruba.name/2009/08/05/concurrent-set-implementations-in-java-6/
          按上面的鏈接說法,可以試試這個:
          Collections.newSetFromMap(new ConcurrentHashMap<Object,Boolean>())
          Use this when you have large sets, a good (and fast) hash function and can estimate the set size and needed concurrency before creating the map.
          -------------------------------------------------
          Map 映射接口 (傳統(tǒng)包util)
          EnumMap 枚舉專用的map,效率高
          HashMap 基本的快速哈希表
          LinkedHashMap 附加了鏈表的哈希表,插入慢,迭代快,有序
          IdentityHashMap 實(shí)現(xiàn)中用“==”運(yùn)算代替“equals()”作為判斷鍵和值是否相等
          TreeMap 基于紅黑樹,插入時就維持順序,可快速獲取子集
          WeakHashMap 以“弱鍵”實(shí)現(xiàn),其中的鍵可能會被垃圾回收,導(dǎo)致此映射被移除
          -------------------------------------------------
          Map 映射接口 (并發(fā)包c(diǎn)oncurrent)
          ConcurrentMap
          ConcurrentHashMap
          ConcurrentSkipListMap
          總結(jié):
          ConcurrentHashMap可以當(dāng)作并發(fā)版的HashMap
          ConcurrentSkipListMap可以當(dāng)作并發(fā)版的TreeMap
          -------------------------------------------------
          How to choose which Java collection class to use?
          http://www.javamex.com/tutorials/collections/how_to_choose_2.shtml
          the Queue interface
          http://www.javamex.com/tutorials/synchronization_concurrency_8_queues_2.shtml
          -------------------------------------------------
          吐槽:不知道“基于數(shù)組的無界雙端隊(duì)列”這句話中的“無界”會不會被敏感掉,想起了“十六嘴交換機(jī)”的故事。

          posted on 2012-08-27 01:26 王星游 閱讀(729) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 聂拉木县| 盐亭县| 黎平县| 治县。| 枣强县| 乌拉特前旗| 修水县| 林口县| 中江县| 四子王旗| 平舆县| 镇巴县| 陆丰市| 大新县| 手游| 高青县| 龙海市| 万安县| 蚌埠市| 正镶白旗| 永清县| 峨山| 兴海县| 察哈| 辉县市| 海安县| 西青区| 梧州市| 江源县| 江津市| 建湖县| 泸州市| 文化| 焦作市| 涪陵区| 和硕县| 双辽市| 沂水县| 灵川县| 岑溪市| 三穗县|