- 相關(guān)推薦
java集合框架
JAVA集合框架
JAVA集合框架(JAVA集合框架)
Java,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語言和Java平臺的總稱。用Java實(shí)現(xiàn)的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺、動態(tài)的Web、Internet計(jì)算。從此,Java被廣泛接受并推動了Web的迅速發(fā)展,常用的瀏覽器現(xiàn)在均支持Java applet。集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。任何集合框架都包含三大塊內(nèi)容:對外的接口、接口的實(shí)現(xiàn)和對集合運(yùn)算的算法。
目錄 集合論引 數(shù)組與容器 返回?cái)?shù)組 類 收縮展開 集合論引集合論是現(xiàn)代數(shù)學(xué)中重要的基礎(chǔ)理論。它的概念和方法已經(jīng)滲透到代數(shù)、拓?fù)浜头治龅仍S多數(shù)學(xué)分支以及物理學(xué)和質(zhì)點(diǎn)力學(xué)等一些自然科學(xué)部門,為這些學(xué)科提供了奠基的方法,改變了這些學(xué)科的面貌。計(jì)算機(jī)科學(xué)作為一門現(xiàn)代科學(xué)因其與數(shù)學(xué)的緣源,自然其中的許多概念也來自數(shù)學(xué),集合是其中之一。如果說集合論的產(chǎn)生給數(shù)學(xué)注入了新的生機(jī)與活力,那么計(jì)算機(jī)科學(xué)中的集合概念給程序員的生活也注入了新的生機(jī)與活力。
集合
很難給集合下一個(gè)精確的定義,通常情況下,把具有相同性質(zhì)的一類東西,匯聚成一個(gè)整體,就可以稱為集合。比如,用Java編程的所有程序員,全體中國人等。通常集合有兩種表示法,一種是列舉法,比如集合A={1,2,3,4},另一種是性質(zhì)描述法,比如集合B={X|0<X<100且X屬于整數(shù)}。集合論的奠基人康托爾在創(chuàng)建集合理論給出了許多公理和性質(zhì),這都成為后來集合在其它領(lǐng)域應(yīng)用的基礎(chǔ),本文并不是講述集合論的,所以如果你對集合論感興趣,可以參考相關(guān)書籍。
集合框架
那么有了集合的概念,什么是集合框架呢?集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。任何集合框架都包含三大塊內(nèi)容:對外的接口、接口的實(shí)現(xiàn)和對集合運(yùn)算的算法。 接口:即表示集合的抽象數(shù)據(jù)類型。接口提供了讓我們對集合中所表示的內(nèi)容進(jìn)行單獨(dú)操作的可能。 實(shí)現(xiàn):也就是集合框架中接口的具體實(shí)現(xiàn)。實(shí)際它們就是那些可復(fù)用的數(shù)據(jù)結(jié)構(gòu)。 算法:在一個(gè)實(shí)現(xiàn)了某個(gè)集合框架中的接口的對象身上完成某種有用的計(jì)算的方法,例如查找、排序等。這些算法通常是多態(tài)的,因?yàn)橄嗤姆椒ǹ梢栽谕粋(gè)接口被多個(gè)類實(shí)現(xiàn)時(shí)有不同的表現(xiàn)。事實(shí)上,算法是可復(fù)用的函數(shù)。如果你學(xué)過C++,那C++中的標(biāo)準(zhǔn)模版庫(STL)你應(yīng)該不陌生,它是眾所周知的集合框架的絕好例子。
數(shù)組與容器數(shù)組與其它容器的區(qū)別體現(xiàn)在三個(gè)方面:效率,類型識別以及可以持有primitives。數(shù)組是Java提供的,能隨機(jī)存儲和訪問reference序列的諸多方法中的,最高效的一種。數(shù)組是一個(gè)簡單的線性序列,所以它可以快速的訪問其中的元素。但是速度是有代價(jià)的;當(dāng)你創(chuàng)建了一個(gè)數(shù)組之后,它的容量就固定了,而且在其生命周期里不能改變。也許你會提議先創(chuàng)建一個(gè)數(shù)組,等到快不夠用的時(shí)候,再創(chuàng)建一個(gè)新的,然后將舊的數(shù)組里的reference全部導(dǎo)到新的里面。其實(shí)(我們以后會講的)ArrayList就是這么做的。但是這種靈活性所帶來的開銷,使得ArrayList的效率比起數(shù)組有了明顯下降。 Java對數(shù)組和容器都做邊界檢查;如果過了界,它就會給一個(gè)RuntimeException。這種異常表明這個(gè)錯(cuò)誤是由程序員造成的`,這樣你就用不著再在程序里面檢查了。 還有一些泛型容器類包括List,Set和Map。他們處理對象的時(shí)候就好像這些對象都沒有自己的具體類型一樣。也就是說,容器將它所含的元素都看成是(Java中所有類的根類)Object的。這樣你只需要建一種容器,就能把所有類型的對象全都放進(jìn)去。從這個(gè)角度來看,這種作法很不錯(cuò)(只是苦了primitive。如果是常量,你還可以用Java的primitive的Wrapper類;如果是變量,那就只能放在你自己的類里了)。與其他泛型容器相比,這里體現(xiàn)數(shù)組的第二個(gè)優(yōu)勢:創(chuàng)建數(shù)組的時(shí)候,你也同時(shí)指明了它所持有的對象的類型(這又引出了第三點(diǎn)--數(shù)組可以持有primitives,而容器卻不行)。也就是說,它會在編譯的時(shí)候作類型檢查,從而防止你插入錯(cuò)誤類型的對象,或者是在提取對象的時(shí)候把對象的類型給搞錯(cuò)了。Java在編譯和運(yùn)行時(shí)都能阻止你將一個(gè)不恰當(dāng)?shù)南鹘o對象。所有這并不是說使用容器就有什么危險(xiǎn),只是如果編譯器能夠幫你指定,那么程序運(yùn)行會更快,最終用戶也會較少收到程序運(yùn)行異常的騷擾。 從效率和類型檢查的角度來看,使用數(shù)組總是沒錯(cuò)的。但是,如果你在解決一個(gè)更為一般的問題,那數(shù)組就會顯得功能太弱了點(diǎn)。 不管你用的是那種類型的數(shù)組,數(shù)組的標(biāo)識符實(shí)際上都是一個(gè)“創(chuàng)建在堆(heap)里的實(shí)實(shí)在在的對象的”reference。實(shí)際上是那個(gè)對象持有其他對象的reference。你即可以用數(shù)組的初始化語句,隱含地創(chuàng)建這個(gè)對象,也可以用new表達(dá)式,明確地創(chuàng)建這個(gè)對象,只讀的length屬性能告訴你數(shù)組能存儲多少元素。它是數(shù)組對象的一部分(實(shí)際上也是你唯一能訪問的屬性或方法)!甗]’語法是另一條訪問數(shù)組對象的途徑。 你沒法知道數(shù)組里面究竟放了多少元素,因?yàn)閘ength只是告訴你數(shù)組能放多少元素,也就是說是數(shù)組對象的容量,而不是它真正已經(jīng)持有的元素的數(shù)量。但是,創(chuàng)建數(shù)組對象的時(shí)候,它所持有的reference都會被自動地初始化為null,所以你可以通過檢查數(shù)組的某個(gè)“槽位”是否為null,來判斷它是否持有對象。以此類推,primitive的數(shù)組,會自動來數(shù)字初始化為零,字符初始化為(char)0,boolean初始化為false。 容器類只能持有Object對象的reference。而數(shù)組除了能持有Objects的reference之外,還可以直接持有primitive。當(dāng)然可以使用諸如Integer,Double之類的wrapper類。把primitive的值放到容器中,但這樣總有點(diǎn)怪怪的。此外,primitive數(shù)組的效率要比wrapper類容器的高出許多。 當(dāng)然,如果你使用primitive的時(shí)候,還需要那種“能隨需要自動擴(kuò)展的”容器類的靈活性,那就不能用數(shù)組了。你只能用容器來存儲primitive的wrapper類。
返回?cái)?shù)組假設(shè)你寫了一個(gè)方法,它返回的不是一個(gè)而是一組東西。那么在Java中就可以返回的“就是一個(gè)數(shù)組”。與C++不同,你永遠(yuǎn)也不必為Java的數(shù)組操心--只要你還需要它,它就還在;一旦你用完了,垃圾回收器會幫你把它打掃干凈。
類java.util里面有一個(gè)Arrays類,它包括了一組可用于數(shù)組的static方法,這些方法都是一些實(shí)用工具。其中有四個(gè)基本方法:用來比較兩個(gè)數(shù)組是否相等的equals();用來填充的fill();用來對數(shù)組進(jìn)行排序的sort();以及用于在一個(gè)已排序的數(shù)組中查找元素的binarySearch()。所有這些方法都對primitive和Object進(jìn)行了重載。此外還有一個(gè)asList()方法,它接受一個(gè)數(shù)組,然后把它轉(zhuǎn)成一個(gè)List容器。 雖然Arrays還是有用的,但它的功能并不完整。舉例來說,如果它能讓我們不用寫for循環(huán)就能直接打印數(shù)組,那就好了。此外,正如你所看到的fill()只能用一個(gè)值填數(shù)組。所以,如果你想把隨機(jī)生成的數(shù)字填進(jìn)數(shù)組的話,fill()是無能為力的。
【java框架】相關(guān)文章:
什么是JAVA04-26
企業(yè)合作框架03-09
java編碼規(guī)范04-29
我的Java路04-30
java實(shí)習(xí)心得01-07
java培訓(xùn)心得05-06
合作管理研究框架04-27