Java集合框架使用總結(jié)
前言:
本文是對(duì)Java集合框架做了一個(gè)概括性的解說,目的是對(duì)Java集合框架體系有個(gè)總體認(rèn)識(shí),如果你想學(xué)習(xí)具體的接口和類的使用方法惹盼,請(qǐng)參看Java API文檔唤反。
一、概述
數(shù)據(jù)結(jié)構(gòu)對(duì)程序設(shè)計(jì)有著深遠(yuǎn)的影響柴信,在面向過程的C語言中套啤,數(shù)據(jù)庫(kù)結(jié)構(gòu)用struct來描述,而在面向?qū)ο蟮木幊讨兴娉#瑪?shù)據(jù)結(jié)構(gòu)是用類來描述的潜沦,并且包含有對(duì)該數(shù)據(jù)結(jié)構(gòu)操作的方法。
在Java語言中绪氛,Java語言的設(shè)計(jì)者對(duì)常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范(接口)和實(shí)現(xiàn)(具體實(shí)現(xiàn)接口的類)唆鸡。所有抽象出來的數(shù)據(jù)結(jié)構(gòu)和操作(算法)統(tǒng)稱為Java集合框架(Java Collection Framework)。
Java程序員在具體應(yīng)用時(shí)枣察,不必考慮數(shù)據(jù)結(jié)構(gòu)和算法實(shí)現(xiàn)細(xì)節(jié)喇闸,只需要用這些類創(chuàng)建出來一些對(duì)象,然后直接應(yīng)用就可以了询件。這樣就大大提高了編程效率燃乍。
二、集合框架的層次結(jié)構(gòu)
Collection是集合接口
|————Set子接口:無序宛琅,不允許重復(fù)刻蟹。
|————List子接口:有序,可以有重復(fù)元素嘿辟。
區(qū)別:Collections是集合類
Set和List對(duì)比:
Set:檢索元素效率低下舆瘪,刪除和插入效率高片效,插入和刪除不會(huì)引起元素位置改變。
List:和數(shù)組類似英古,List可以動(dòng)態(tài)增長(zhǎng)淀衣,查找元素效率高,插入刪除元素效率低召调,因?yàn)闀?huì)引起其他元素位置改變膨桥。
Set和List具體子類:
Set
|————HashSet:以哈希表的形式存放元素,插入刪除速度很快唠叛。
List
|————ArrayList:動(dòng)態(tài)數(shù)組
|————LinkedList:鏈表只嚣、隊(duì)列、堆棧艺沼。
Array和java.util.Vector
Vector是一種老的動(dòng)態(tài)數(shù)組册舞,是線程同步的,效率很低障般,一般不贊成使用调鲸。
三、Iterator迭代器(接口)
Iterator是獲取集合中元素的過程挽荡,實(shí)際上幫助獲取集合中的元素藐石。
迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器與枚舉有兩點(diǎn)不同:
迭代器允許調(diào)用方利用定義良好的語義在迭代期間從迭代器所指向的集合移除元素徐伐。
方法名稱得到了改進(jìn)。
Iterator僅有一個(gè)子接口ListIterator募狂,是列表迭代器办素,允許程序員按任一方向遍歷列表、迭代期間修改列表祸穷,并獲得迭代器在列表中的當(dāng)前位置性穿。ListIterator 沒有當(dāng)前元素;它的光標(biāo)位置 始終位于調(diào)用 previous() 所返回的元素和調(diào)用 next() 所返回的元素之間雷滚。在長(zhǎng)度為 n 的列表中需曾,有 n+1 個(gè)有效的索引值,從 0 到 n(包含)祈远。
四呆万、集合框架之外的Map接口
Map將鍵映射到值的對(duì)象。一個(gè)映射不能包含重復(fù)的鍵车份;每個(gè)鍵最多只能映射一個(gè)值谋减。
Map接口是Dictionary(字典)抽象類的替代品。
Map 接口提供三種collection 視圖扫沼,允許以鍵集出爹、值集合或鍵-值映射關(guān)系集的形式查看某個(gè)映射的內(nèi)容庄吼。映射的順序 定義為迭代器在映射的 collection 視圖中返回其元素的順序。某些映射實(shí)現(xiàn)可明確保證其順序严就,如 TreeMap 類总寻;某些映射實(shí)現(xiàn)則不保證順序,如 HashMap 類梢为。
有兩個(gè)常見的已實(shí)現(xiàn)的子類:
HashMap:基于哈希表的 Map 接口的實(shí)現(xiàn)渐行。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵抖誉。(除了不同步和允許使用 null 之外殊轴,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序袒炉,特別是它不保證該順序恒久不變旁理。
TreeMap:它實(shí)現(xiàn)SortedMap 接口的基于紅黑樹的實(shí)現(xiàn)。此類保證了映射按照升序順序排列關(guān)鍵字我磁,根據(jù)使用的構(gòu)造方法不同孽文,可能會(huì)按照鍵的類的自然順序 進(jìn)行排序(參見 Comparable),或者按照創(chuàng)建時(shí)所提供的比較器進(jìn)行排序夺艰。
Hashtable:此類實(shí)現(xiàn)一個(gè)哈希表芋哭,該哈希表將鍵映射到相應(yīng)的值。任何非 null 對(duì)象都可以用作鍵或值郁副。
五减牺、線程安全類
在集合框架中,有些類是線程安全的存谎,這些都是JDK1.1中的出現(xiàn)的拔疚。在JDK1.2之后,就出現(xiàn)許許多多非線程安全的類既荚。
下面是這些線程安全的同步的類:
Vector:就比ArrayList多了個(gè)同步化機(jī)制(線程安全)稚失。
Statck:堆棧類,先進(jìn)后出恰聘。
Hashtable:就比HashMap多了個(gè)線程安全句各。
Enumeration:枚舉,相當(dāng)于迭代器晴叨。
除了這些之外凿宾,其他的都是非線程安全的類和接口。
線程安全的類其方法是同步的兼蕊,每次只能一個(gè)訪問菌湃。是重量級(jí)對(duì)象,效率較低遍略。對(duì)于非線程安全的類和接口惧所,在多線程中需要程序員自己處理線程安全問題骤坐。
六、其他一些接口和類介紹
Dictionary和Hashtable類:
Dictionary提供鍵值映射的功能下愈,是個(gè)抽象類纽绍。一般使用它的子類HashTable類。遍歷Hashtable類要用到枚舉势似。
Properties類
Properties 繼承于 Hashtable拌夏,Properties 類表示了一個(gè)持久的屬性集。Properties 可保存在流中或從流中加載履因。屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串障簿。一般可以通過讀取properties配置文件來填充Properties對(duì)象。