資源描述:
《java集合框架思考》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、JAVA集合框架思考jungleford如是說對于Java集合框架(JavaCollectionsFramework,JCF),Java玩家大概都不會陌生,在C++里面相似的概念是標(biāo)準(zhǔn)模板庫(StandardTemplateLibrary,STL),主要是對一些數(shù)據(jù)結(jié)構(gòu)和相關(guān)算法的封裝。前段時間在J2SE版看到一個關(guān)于Java集合框架的問題,當(dāng)時re了一下,簡單解釋了一些的概念,考慮到這是一個Java初學(xué)者將會經(jīng)常接觸的工具,所以有了以下的一些文字。主要是參考了IBMdeveloperWorks上的一篇教程,它可能解釋得更加清晰,這里算是濃縮了一下吧,真正的來龍去脈可以看看
2、JDK文檔里的“TheCollectionsFramework”,說明更為詳細。問題的源頭集合:對象的容器與數(shù)據(jù)結(jié)構(gòu)回憶一下我們在程序設(shè)計里頭可能會面對一些什么,無非是兩類:基本類型和復(fù)合類型,后者常見的組織方式就是類。和基本類型不同,類對象通常是需要以動態(tài)方式分配的,譬如在內(nèi)存的堆空間里new一個對象,這個我們一寫OO的程序就必然會用到。同時我們面對的不僅僅是單個的基本類型或?qū)ο螅瑢Χ鄠€這樣的數(shù)據(jù)我們通常采用的組織方式是什么?不錯,是數(shù)組,這是伴隨程序設(shè)計的一個古老概念。數(shù)組的優(yōu)點顯而易見,像根據(jù)下標(biāo)檢索元素這樣的操作不費吹灰之力,但缺點也很明顯:空間固定而不能動態(tài)增長(
3、像Java這樣的強類型語言對數(shù)組越界是及其敏感的),插入或刪除元素比較費勁。因此數(shù)組不是解決一切集合問題的方便工具。我們可能需要一些新的工具,研究這些工具常常就是研究數(shù)據(jù)結(jié)構(gòu),特別的,數(shù)組本身就是一種線性有序的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)的數(shù)學(xué)基礎(chǔ)是集合論,為什么這么說呢?上面倒??衷諼頤且?芯康牟皇塹ジ齙幕?糾嘈突蚨韻螅?喔齠韻蟮惱?宀瘓褪羌?下穡看?O的角度上看,集合也是一種對象,但它是一種特殊的對象:對象的容器(注意,我們這里沒有繼續(xù)討論基本類型的集合,因為基本類型和存儲分配方式與對象有著本質(zhì)的差別)。集合論的一個根本問題就是:給定一個元素,集合必須能夠回答該元素是或者不是屬于
4、這個集合。還有一個問題也很重要,就是:如果元素是屬于一個集合,那該元素在集合中的地位應(yīng)該是唯一的,或者說它是唯一確定的。當(dāng)然還有其它問題,譬如查找、遍歷、排序等等,這和具體的集合類型相關(guān),后面將會講到。無序集、有序集、映射談到集合的類型,我們在高中所學(xué)的集合概念是其中的一種,叫做“無序集”,也就是說集合的各個元素都是平等的,沒有先后的區(qū)別,于是在無序集當(dāng)中就決不允許出現(xiàn)一模一樣的元素,否則當(dāng)取到這個元素的時候就不知道應(yīng)該取哪一個,這就違反了上面的“唯一確定”原則。等到我們上了大學(xué),開始知道了另一種集合類型,叫做“有序集”(或者叫“線性表”,區(qū)別于以后碰到的像“樹”,“圖”這
5、樣的非線性的數(shù)據(jù)結(jié)構(gòu)),如果是計算機專業(yè)的,大概學(xué)過離散數(shù)學(xué)當(dāng)中的“代數(shù)結(jié)構(gòu)”,那你就更清楚的知道,“有序集”其實是一種“二元關(guān)系”,確切的說是“偏序關(guān)系”,它是可以包含相同元素的,因為兩個的相同元素的“序號”可以不同,這樣根據(jù)“序號”仍可以“唯一確定”一個元素,數(shù)組就是一種有序集,有序集的另一個特點就是任意兩個元素可以確定他們的順序。無序集,有序集,難道還有第三種可能?呵呵,它還是出現(xiàn)在我們的高中代數(shù)課本里,叫做“映射”。映射也是集合?其實自從康托爾以來,集合論就認(rèn)為“萬物皆集合”(但也就是這個斷言導(dǎo)致了集合論以后的尷尬境地,有興趣可以看看羅素或哥德爾的一些結(jié)論,或goo
6、gle“集合論悖論”)。映射其實是一種“元素對”的集合,就像f(a)=b,f(c)=d,...等效于集合(無序集){(a,b),(c,d),...},在“映射”中可以看作是(原象,象)的集合,換一種說法就是(關(guān)鍵字key,值value)的集合。所以我們可以在笛卡兒正交坐標(biāo)平面上畫出漂亮的函數(shù)圖像,因為在集合論看來,函數(shù)(映射)就是二維平面上的一個個點,明白了?這樣一來上面的“有序集”也好理解了,偏序關(guān)系a>b>c>d>...(不知道“偏序關(guān)系”就把它們看作是數(shù)組x[1]=a,x[2]=b,x[3]=c,x[4]=d...好了)等效于無序集{(1,a),(2,b),(3,c)
7、,(4,d),...},于是乎,所有的集合都等效于無序集!所以高中只教了我們一種集合,呵呵……JCF的全家福好啦好啦,這些我們都知道,又不是在上數(shù)學(xué)課,說了這么多廢話,怎么還沒扯到正題上來?JCF的影子我還沒看見呢!列位看官別急,這就給您道來。其實上面的概念對理解JCF非常重要。JCF是個頗有點規(guī)模的家族,看看它的類層次關(guān)系圖就知道了,下面這張圖(圖1)摘自著名的ThinkinginJava:圖1JCF層次結(jié)構(gòu)哇,這么多接口和類,真有點讓人無從下手的感覺。其實我們真正需要記住的只是這么一個超超easy的結(jié)構(gòu)(圖2)