前言:
本文是對Java集合框架做了一個概括性的解說妇多,目的是對Java集合框架體系有個總體認識壳快。
一、概述
數(shù)據(jù)結(jié)構(gòu)對程序設計有著深遠的影響贞绵,在面向過程的C語言中厉萝,數(shù)據(jù)庫結(jié)構(gòu)用struct來描述,而在面向?qū)ο蟮木幊讨校瑪?shù)據(jù)結(jié)構(gòu)是用類來描述的谴垫,并且包含有對該數(shù)據(jù)結(jié)構(gòu)操作的方法章母。
在Java語言中,Java語言的設計者對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范(接口)和實現(xiàn)(具體實現(xiàn)接口的類)翩剪。所有抽象出來的數(shù)據(jù)結(jié)構(gòu)和操作(算法)統(tǒng)稱為Java集合框架(Java Collection Framework)乳怎。
Java程序員在具體應用時,不必考慮數(shù)據(jù)結(jié)構(gòu)和算法實現(xiàn)細節(jié)前弯,只需要用這些類創(chuàng)建出來一些對象蚪缀,然后直接應用就可以了。這樣就大大提高了編程效率恕出。
二询枚、集合框架的層次結(jié)構(gòu)
Collection是集合接口
??????? |————Set子接口:無序,不允許重復浙巫。
??????? |————List子接口:有序金蜀,可以有重復元素。
區(qū)別:Collections是集合類
Set和List對比:
Set:檢索元素效率低下狈醉,刪除和插入效率高廉油,插入和刪除不會引起元素位置改變。
List:和數(shù)組類似苗傅,List可以動態(tài)增長抒线,查找元素效率高,插入刪除元素效率低渣慕,因為會引起其他元素位置改變嘶炭。
Set和List具體子類:
Set
?|————HashSet:以哈希表的形式存放元素,插入刪除速度很快逊桦。
List
?|————ArrayList:動態(tài)數(shù)組
?|————LinkedList:鏈表眨猎、隊列、堆棧强经。
Array和java.util.Vector
Vector是一種老的動態(tài)數(shù)組帮掉,是線程同步的,效率很低历涝,一般不贊成使用薪缆。
三、Iterator迭代器(接口)
Iterator是獲取集合中元素的過程炬称,實際上幫助獲取集合中的元素汁果。
迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器與枚舉有兩點不同:
迭代器允許調(diào)用方利用定義良好的語義在迭代期間從迭代器所指向的集合移除元素玲躯。
方法名稱得到了改進据德。
Iterator僅有一個子接口ListIterator鳄乏,是列表迭代器,允許程序員按任一方向遍歷列表棘利、迭代期間修改列表橱野,并獲得迭代器在列表中的當前位置。ListIterator 沒有當前元素赡译;它的光標位置 始終位于調(diào)用 previous() 所返回的元素和調(diào)用 next() 所返回的元素之間仲吏。在長度為 n 的列表中,有 n+1 個有效的索引值蝌焚,從 0 到 n(包含)裹唆。
四、集合框架之外的Map接口
Map將鍵映射到值的對象只洒。一個映射不能包含重復的鍵许帐;每個鍵最多只能映射一個值。
Map接口是Dictionary(字典)抽象類的替代品毕谴。
Map 接口提供三種collection 視圖成畦,允許以鍵集、值集合或鍵-值映射關系集的形式查看某個映射的內(nèi)容涝开。映射的順序 定義為迭代器在映射的 collection 視圖中返回其元素的順序循帐。某些映射實現(xiàn)可明確保證其順序,如 TreeMap 類舀武;某些映射實現(xiàn)則不保證順序拄养,如 HashMap 類。
有兩個常見的已實現(xiàn)的子類:
HashMap:基于哈希表的 Map 接口的實現(xiàn)银舱。此實現(xiàn)提供所有可選的映射操作瘪匿,并允許使用 null 值和 null 鍵。(除了不同步和允許使用 null 之外寻馏,HashMap 類與 Hashtable 大致相同棋弥。)此類不保證映射的順序,特別是它不保證該順序恒久不變诚欠。
TreeMap:它實現(xiàn)SortedMap 接口的基于紅黑樹的實現(xiàn)顽染。此類保證了映射按照升序順序排列關鍵字,根據(jù)使用的構(gòu)造方法不同轰绵,可能會按照鍵的類的自然順序 進行排序(參見 Comparable)家乘,或者按照創(chuàng)建時所提供的比較器進行排序。
Hashtable:此類實現(xiàn)一個哈希表藏澳,該哈希表將鍵映射到相應的值。任何非 null 對象都可以用作鍵或值耀找。
五翔悠、線程安全類
在集合框架中业崖,有些類是線程安全的,這些都是JDK1.1中的出現(xiàn)的蓄愁。在JDK1.2之后双炕,就出現(xiàn)許許多多非線程安全的類。
下面是這些線程安全的同步的類:
Vector:就比ArrayList多了個同步化機制(線程安全)撮抓。
Statck:堆棧類妇斤,先進后出。
Hashtable:就比HashMap多了個線程安全丹拯。
Enumeration:枚舉站超,相當于迭代器。
除了這些之外乖酬,其他的都是非線程安全的類和接口死相。
線程安全的類其方法是同步的,每次只能一個訪問咬像。是重量級對象算撮,效率較低。對于非線程安全的類和接口县昂,在多線程中需要程序員自己處理線程安全問題肮柜。
六、其他一些接口和類介紹
Dictionary和Hashtable類:
Dictionary提供鍵值映射的功能倒彰,是個抽象類审洞。一般使用它的子類HashTable類。遍歷Hashtable類要用到枚舉狸驳。
Properties類
Properties 繼承于 Hashtable预明,Properties 類表示了一個持久的屬性集。Properties 可保存在流中或從流中加載耙箍。屬性列表中每個鍵及其對應值都是一個字符串撰糠。一般可以通過讀取properties配置文件來填充Properties對象。