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之外的優秀數據集合工具包,使用拿來主義即可。