本文是對Java集合架構做了一個概括性的解說,目的是對Java集合架構體系有個總體認識,如果你想學習具體的介面和類的使用方法,請參看Java API文檔。
一、概述
資料結構對程式設計有著深遠的影響,在面向過程的C語言中,資料庫結構用struct來描述,而在物件導向的編程中,資料結構是用類來描述的,並且包含有對該資料結構操作的方法。
在Java語言中,Java語言的設計者對常用的資料結構和演算法做了一些規範(介面)和實現(具體實現介面的類)。所有抽象出來的資料結構和操作(演算法)統稱為Java集合架構(Java Collection Framework)。
Java程式員在具體應用時,不必考慮資料結構和演算法實現細節,只需要用這些類建立出來一些對象,然後直接應用就可以了。這樣就大大提高了編程效率。
二、集合架構的階層
Collection是集合介面
|————Set子介面:無序,不允許重複。
|————List子介面:有序,可以有重複元素。
區別:Collections是集合類
Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。
List:和數組類似,List可以動態增長,尋找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。
Set和List具體子類:
Set
|————HashSet:以雜湊表的形式存放元素,插入刪除速度很快。
List
|————ArrayList:動態數組
|————LinkedList:鏈表、隊列、堆棧。
Array和java.util.Vector
Vector是一種老的動態數組,是線程同步的,效率很低,一般不贊成使用。
三、Iterator迭代器(介面)
Iterator是擷取集合中元素的過程,實際上協助擷取集合中的元素。
迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器與枚舉有兩點不同:
迭代器允許調用方利用定義良好的語義在迭代期間從迭代器所指向的集合移除元素。
方法名稱得到了改進。
Iterator僅有一個子介面ListIterator,是列表迭代器,允許程式員按任一方向遍曆列表、迭代期間修改列表,並獲得迭代器在列表中的當前位置。ListIterator 沒有當前元素;它的游標位置 始終位於調用 previous() 所返回的元素和調用 next() 所返回的元素之間。在長度為 n 的列表中,有 n+1 個有效索引值,從 0 到 n(包含)。
四、集合架構之外的Map介面
Map將鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射一個值。
Map介面是Dictionary(字典)抽象類別的替代品。
Map 介面提供三種collection 視圖,允許以鍵集、值集合或鍵-值對應關係集的形式查看某個映射的內容。映射的順序 定義為迭代器在映射的 collection 視圖中返回其元素的順序。某些映射實現可明確保證其順序,如 TreeMap 類;某些映射實現則不保證順序,如 HashMap 類。
有兩個常見的已實現的子類:
HashMap:基於雜湊表的 Map 介面的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。(除了不同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恒久不變。
TreeMap:它實現SortedMap 介面的基於紅/黑樹狀結構的實現。此類保證了映射按照升序順序排列關鍵字,根據使用的構造方法不同,可能會按照鍵的類的自然順序 進行排序(參見 Comparable),或者按照建立時所提供的比較子進行排序。
Hashtable:此類實現一個雜湊表,該雜湊表將鍵映射到相應的值。任何非 null 對象都可以用作鍵或值。
五、安全執行緒類
在集合架構中,有些類是安全執行緒的,這些都是JDK1.1中的出現的。在JDK1.2之後,就出現許許多多非安全執行緒的類。
下面是這些安全執行緒的同步的類:
Vector:就比ArrayList多了個同步化機制(安全執行緒)。
Statck:堆棧類,先進後出。
Hashtable:就比HashMap多了個安全執行緒。
Enumeration:枚舉,相當於迭代器。
除了這些之外,其他的都是非安全執行緒的類和介面。
安全執行緒的類其方法是同步的,每次只能一個訪問。是重量級對象,效率較低。對於非安全執行緒的類和介面,在多線程中需要程式員自己處理安全執行緒問題。
六、其他一些介面和類介紹
Dictionary和Hashtable類:
Dictionary提供索引值映射的功能,是個抽象類別。一般使用它的子類HashTable類。遍曆Hashtable類要用到枚舉。
Properties類
Properties 繼承於 Hashtable,Properties 類表示了一個持久的屬性集。Properties 可儲存在流中或從流中載入。屬性列表中每個鍵及其對應值都是一個字串。一般可以通過讀取properties設定檔來填充Properties對象。