陳浩鑫+劉艷華+張桂娟
摘 要:Java,是由Sun公司于1995年推出的編程語(yǔ)言。在Java語(yǔ)言中,不管是大編程項(xiàng)目也好,小編程項(xiàng)目也好,為了達(dá)到方便的目的,我們都要用到集合框架。集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。任何集合框架都包含三大塊內(nèi)容:對(duì)外的接口、接口的實(shí)現(xiàn)和對(duì)集合運(yùn)算的算法。
關(guān)鍵詞:集合框架;集合;Collection
在Java中,Collection集合接口是Collection層次結(jié)構(gòu)中的根接口。Collection表示一組對(duì)象,這些對(duì)象也稱為collection的元素。一些Collection是有序、允許有重復(fù)元素的,而另一些則是無(wú)序的、不允許有重復(fù)元素的。由于JDK不提供此接口的任何直接實(shí)現(xiàn),因此它提供更具體的子接口來(lái)進(jìn)行集合的實(shí)現(xiàn),如Set和List。此接口通常用來(lái)傳遞Collection,并在需要最大普遍性的地方操作這些Collection。所有通用的Collection實(shí)現(xiàn)類(通常通過(guò)它的一個(gè)子接口間接實(shí)現(xiàn)Collection)應(yīng)該提供兩個(gè)“標(biāo)準(zhǔn)”構(gòu)造方法:一個(gè)是無(wú)參構(gòu)造方法,用于創(chuàng)建空collection;另一個(gè)是帶有Collection類型單參數(shù)的構(gòu)造方法,用于創(chuàng)建一個(gè)具有與其參數(shù)相同元素新的Collection。
如果仔細(xì)劃分的話,Collection接口下的兩個(gè)子接口list和set又具有幾個(gè)我們經(jīng)常使用的具體實(shí)現(xiàn)類。在list接口下有底層是鏈表結(jié)構(gòu)的LinkedList,有底層是數(shù)組的ArrayList、Vector,為什么底層是數(shù)組的會(huì)有兩個(gè)?因?yàn)樗麄兤湓诠δ苌洗篌w沒(méi)有區(qū)別。但ArrayList是線程不安全的,而vector是線程的安全的,當(dāng)然了,在Java中,線程安全就代表著程序的完整度高一些,運(yùn)行速度慢一些,所以基于數(shù)組的list集合我們一般采用ArrayList集合。而在Set中,我們又有基于Hash算法的HashSet和基于二叉樹(shù)算法的TreeSet。在Map集合中,我們一般常用到的就是HashMap集合。今天,我們重點(diǎn)介紹Collection集合。
在集合框架中,我們要如何遍歷Collection中的每一個(gè)元素?不論Collection的實(shí)際類型如何,它都支持一個(gè)iterator()的方法,該方法返回一個(gè)迭代子,使用該迭代子即可逐一訪問(wèn)Collection中每一個(gè)元素。典型的用法如下:
Iterator it=collection.iterator();//獲得一個(gè)迭代元素
while(it.hasNext()) {
Object obj=it.next();//得到下一個(gè)元素
}
下面,筆者將就以上幾個(gè)集合作為分類為大家簡(jiǎn)略地介紹一下集合。
List接口:
List是有序的,允許重復(fù)的Colllection集合的子接口,除了具有Collection接口必備的iterator()方法外,List接口還可以使用Collections類中對(duì)集合操作的一些方法,如add(int index,Element)將指定的元素插入此列表中的指定位置。
remove(int index)移除此列表中指定位置上的元素等方法。
實(shí)現(xiàn)List接口的常用類有LinkedList、ArrayList。
LinkedList類:
LinkedList類實(shí)現(xiàn)了List接口,允許集合中存在null。此外,LinkedList還具有獨(dú)特的get()、set()等方法,這些獨(dú)特的操作方法使LinkedList可被用作或看作一個(gè)環(huán)狀的鏈表,我們一般將其稱為雙向循環(huán)鏈表。
但值得我們注意LinkedList的是,其沒(méi)有同步方法,如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)List,則必須自己實(shí)現(xiàn)訪問(wèn)同步。一種解決方法是在創(chuàng)建List時(shí)構(gòu)造一個(gè)同步的List并且將其上鎖,保證數(shù)據(jù)的安全性:
List list=Collections.synchronizedList(new LinkedList(...));
ArrayList類:
ArrayList的底層由數(shù)組完成,因此它具有數(shù)組的一些特性,即增刪慢、查詢快。每個(gè)ArrayList實(shí)例都有一個(gè)容量,即用于存儲(chǔ)元素的數(shù)組大小。這個(gè)容量可隨著不斷添加新元素而增加,而在這方面,數(shù)組就沒(méi)有集合具有優(yōu)勢(shì),數(shù)組的擴(kuò)容需要代碼完成,集合是隨著數(shù)據(jù)的插入而自動(dòng)擴(kuò)容,隨著數(shù)據(jù)的消失而自動(dòng)消失。
Set接口:
與List不同的是,在Set中的對(duì)象元素不能重復(fù),也就是說(shuō),你不能把同樣的東西兩次放入同一個(gè)Set容器中。它的常用具體實(shí)現(xiàn)有HashSet和TreeSet類。HashSet能快速定位一個(gè)元素,但是你放到HashSet中的對(duì)象需要實(shí)現(xiàn)hashCode()方法,它使用了數(shù)據(jù)庫(kù)中的哈希算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對(duì)象是可排序的,這就用到了集合框架提供的另外兩個(gè)實(shí)用類Comparable和Comparator。一個(gè)類是可排序的,當(dāng)實(shí)現(xiàn)Comparable接口時(shí)要重寫(xiě)接口中的Compareto方法,要么實(shí)現(xiàn)Comparator接口,如果多個(gè)類具有相同的排序算法,那就不需要在每分別重復(fù)定義相同的排序算法,只要實(shí)現(xiàn)Comparator接口即可。集合框架中還有兩個(gè)很實(shí)用的公用類:Collections和Arrays。Collections提供了對(duì)一個(gè)Collection容器進(jìn)行諸如排序、復(fù)制、查找和填充等一些非常有用的方法,以供Set集合的使用。
參考文獻(xiàn):
[1] Stuart Reges(美),Marty Stepp . Java程序設(shè)計(jì)教程大學(xué)[D].陳志,譯.機(jī)械工業(yè)出版社,2009.
[2] Y.Daniel Liang(美) . Java語(yǔ)言程序設(shè)計(jì)[M].機(jī)械工業(yè)出版社,2008.
[3] Cay S(美) . Horstmann Gary Cornell . Java核心技術(shù)[M].人民郵電出版社,2013.