讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議82:由點及面,一葉知秋集合大家族 >

建議82:由點及面,一葉知秋集合大家族

Java中的集合類實在是太豐富了,有常用的ArrayList、HashMap,也有不常用的Stack、Queue,有線程安全的Vector、HashTable,也有線程不安全的LinkedList、TreeMap,有阻塞式的ArrayBlockingQueue,也有非阻塞式的PriorityQueue等,整個集閤家族非常龐大,而且也是錯綜複雜,可以劃分為以下幾類:

(1)List

實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack,其中ArrayList是一個動態數組,LinkedList是一個雙向鏈表,Vector是一個線程安全的動態數組,Stack是一個對像棧,遵循先進後出的原則。

(2)Set

Set是不包含重複元素的集合,其主要的實現類有:EnumSet、HashSet、TreeSet,其中EnumSet是枚舉類型的專用Set,所有元素都是枚舉類型;HashSet是以哈希碼決定其元素位置的Set,其原理與HashMap相似,它提供快速的插入和查找方法;TreeSet是一個自動排序的Set,它實現了SortedSet接口。

(3)Map

Map是一個大家族,它可以分為排序Map和非排序Map,排序Map主要是TreeMap類,它根據Key值進行自動排序;非排序Map主要包括:HashMap、HashTable、Properties、EnumMap等,其中Properties是HashTable的子類,它的主要用途是從Property文件中加載數據,並提供方便的讀寫操作;EnumMap則是要求其Key必須是某一個枚舉類型。

Map中還有一個WeakHashMap類需要說明,它是一個採用弱鍵方式實現的Map類,它的特點是:WeakHashMap對象的存在並不會阻止垃圾回收器對鍵值對的回收,也就是說使用WeakHashMap裝載數據不用擔心內存溢出的問題,GC會自動刪除不用的鍵值對,這是好事。但也存在一個嚴重問題:GC是靜悄悄回收的(何時回收?God knows!),我們的程序無法知曉該動作,存在著重大的隱患。

(4)Queue

隊列,它分為兩類,一類是阻塞式隊列,隊列滿了以後再插入元素則會拋出異常,主要包括:ArrayBlockingQueue、PriorityBlockingQueue、LinkedBlockingQueue,其中ArrayBlockingQueue是一個以數組方式實現的有界阻塞隊列,PriorityBlockingQueue是依照優先級組建的隊列,LinkedBlockingQueue是通過鏈表實現的阻塞隊列;另一類是非阻塞隊列,無邊界的,只要內存允許,都可以持續追加元素,我們最經常使用的是PriorityQueue類。

還有一種隊列,是雙端隊列,支持在頭、尾兩端插入和移除元素,它的主要實現類是:ArrayDeque、LinkedBlockingDeque、LinkedList。

(5)數組

數組與集合的最大區別就是數組能夠容納基本類型,而集合就不行,更重要的一點就是所有的集合底層存儲的都是數組。

(6)工具類

數組的工具類是java.util.Arrays和java.lang.reflect.Array,集合的工具類是java.util.Collections,有了這兩個工具類,操作數組和集合會易如反掌,得心應手。

(7)擴展類

集合類當然可以自行擴展了,想寫一個自己的List?沒問題,但最好的辦法還是「拿來主義」,可以使用Apache的commons-collections擴展包,也可以使用Google的google-collections擴展包,這些足以應對我們的開發需要。

注意 commons-collections、google-collections是JDK之外的優秀數據集合工具包,使用拿來主義即可。