麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java集合構(gòu)架研究之一

2019-11-18 14:28:48
字體:
供稿:網(wǎng)友

  摘要:

  本文論述了java容器類庫的產(chǎn)生、變化與發(fā)展,然而并沒有具體講解怎么使用這些類庫,試圖從其發(fā)展與變化的歷史中幫助Java學(xué)習(xí)者把握J(rèn)ava的容器類庫。另外在本篇最后會討論在即將發(fā)布的代號為Tiger的J2SE1.5中加入的新特性之一:泛型,它將使容器的功能更加強(qiáng)大。

  一、集合論引述

  集合論是現(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ī)科學(xué)中的集合概念給程序員的生活也注入了新的生氣與活力。

  1、什么是集合

  很難給集合下一個(gè)精確的定義,通常情況下,把具有相同性質(zhì)的一類東西,匯聚成一個(gè)整體,就可以稱為集合。比如,用Java編程的所有程序員,全體中國人等。通常集合有兩種表示法,一種是列舉法,比如集合A={1,2,3,4},另一種是性質(zhì)描述法,比如集合B={X0<X<100且X屬于整數(shù)}。集合論的奠基人康托爾在創(chuàng)建集合理論給出了許多公理和性質(zhì),這都成為后來集合在其它領(lǐng)域應(yīng)用的基礎(chǔ),本文并不是講述集合論的,所以假如你對集合論感愛好,可以參考相關(guān)書籍。

  2、什么是集合框架

  那么有了集合的概念,什么是集合框架呢?集合框架是為表示和操作集合而規(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)該不生疏,它是眾所周知的集合框架的絕好例子。
  3、集合框架對我們編程有何助益

  到底集合框架對我們編程有什么好處呢?

  它減少了程序設(shè)計(jì)的辛勞。集合框架通過提供有用的數(shù)據(jù)結(jié)構(gòu)和算法使你能集中注重力于你的程序的重要部分上,而不是為了讓程序能正常運(yùn)轉(zhuǎn)而將注重力于低層設(shè)計(jì)上。通過這些在無關(guān)API之間的簡易的互用性,使你免除了為改編對象或轉(zhuǎn)換代碼以便聯(lián)合這些API而去寫大量的代碼。

  它提高了程序速度和質(zhì)量。集合框架通過提供對有用的數(shù)據(jù)結(jié)構(gòu)和算法的高性能和高質(zhì)量的實(shí)現(xiàn)使你的程序速度和質(zhì)量得到提高。因?yàn)槊總€(gè)接口的實(shí)現(xiàn)是可互換的,所以你的程序可以很輕易的通過改變一個(gè)實(shí)現(xiàn)而進(jìn)行調(diào)整。另外,你將可以從寫你自己的數(shù)據(jù)結(jié)構(gòu)的苦差事中解脫出來,從而有更多時(shí)間關(guān)注于程序其它部分的質(zhì)量和性能。

  減少去學(xué)習(xí)和使用新的API 的辛勞。許多API天生的有對集合的存儲和獲取。在過去,這樣的API都有一些子API幫助操縱它的集合內(nèi)容,因此在那些非凡的子API之間就會缺乏一致性,你也不得不從零開始學(xué)習(xí),并且在使用時(shí)也很輕易犯錯。而標(biāo)準(zhǔn)集合框架接口的出現(xiàn)使這個(gè)問題迎刃而解。

  減少了設(shè)計(jì)新API的努力。設(shè)計(jì)者和實(shí)現(xiàn)者不用再在每次創(chuàng)建一種依靠于集合內(nèi)容的API時(shí)重新設(shè)計(jì),他們只要使用標(biāo)準(zhǔn)集合框架的接口即可。

  集合框架鼓勵軟件的復(fù)用。對于遵照標(biāo)準(zhǔn)集合框架接口的新的數(shù)據(jù)結(jié)構(gòu)天生即是可復(fù)用的。同樣對于操作一個(gè)實(shí)現(xiàn)了這些接口的對象的算法也是如此。

  有了這些優(yōu)點(diǎn),并通過合理的使用,它就會成為程序員的一種強(qiáng)大的工具。不過,從歷史上來看,集合大多其結(jié)構(gòu)相當(dāng)復(fù)雜,也就給它們一個(gè)造成極不合理的學(xué)習(xí)曲線的壞名聲。但是,希望Java2的集合框架能縮短你的學(xué)習(xí)曲線,從而快速把握它。

  在許多高級語言中的數(shù)組其實(shí)也是集合的一種簡單實(shí)現(xiàn),比如C,C++,Pascal和Java。

  數(shù)組保存著相同類型的多個(gè)值,它的長度在數(shù)組被創(chuàng)建時(shí)就固定下來,建立之后就無法改變。假如你需要一種大小能動態(tài)改變的存儲結(jié)構(gòu),數(shù)組就不適合了,這時(shí)集合框架就有了用武之地了。

  二、Java1.2之前的容器類庫

  其實(shí)在Java2之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴(kuò)展的容器類,比如Vector,Stack,Hashtable等。Vector中包含的元素可以通過一個(gè)整型的索引值取得,它的大小可以在添加或移除元素時(shí)自動增加或縮小。然而,Vector的設(shè)計(jì)卻存在極多缺限(下面會說到)。Stack是一種后進(jìn)先出(LIFO)的堆棧序列,學(xué)過數(shù)據(jù)結(jié)構(gòu)的都會知道,它的重要特點(diǎn)是先放入的東西最后才能被取出。Hashtable與Java2中的Map類似,可以看成一種關(guān)聯(lián)或映射數(shù)組,可以將兩個(gè)或多個(gè)毫無關(guān)系的對象相關(guān)聯(lián),與數(shù)組不同的是它的大小可以動態(tài)變化。

  Vector的操作很簡單,通過addElement()加入一個(gè)對象,用elementAt()取出它,還可以查詢當(dāng)前所保存的對象的個(gè)數(shù)size();另外還有一個(gè)Enumeration類提供了連續(xù)操作Vector中元素的方法,這可以通過Vector中的elements()方法來獲取一個(gè)Enumeration類的對象,可以用一個(gè)While循環(huán)來遍歷其中的元素。用hasMoreElements()檢查其中是否還有更多的元素。用nextElement()獲得下一個(gè)元素。Enumeration的用意在于使你能完全不用理會你要遍歷的容器的基礎(chǔ)結(jié)構(gòu),只關(guān)注你的遍歷方法,這也就使得遍歷方法的重用成為可能。由于這種思想的強(qiáng)大功能,所以在Java2中被保留下來,不過具體實(shí)現(xiàn),方法名和內(nèi)部算法都改變了,這就是Java2中的Iterator以及ListIterator類。然而Enumeration的功能卻十分有限,比如只能朝一個(gè)方向進(jìn)行,只能讀取而不能更改等。

  另一個(gè)單元素容器是Stack,它最常用的操作便是壓入和彈出,最后壓入的元素最先被彈出。你可以想象一個(gè)只上面開口的書箱,最后放進(jìn)去的書一定是最先被拿到,而最先放進(jìn)去的只有在全部書拿出后才能取出,這種特性被稱為后進(jìn)先出(LIFO)。在Java中Stack的的用法也很簡單,有push()壓入一個(gè)元素,用pop()彈出一個(gè)元素。然而它的設(shè)計(jì)卻無法讓人理解,Stack繼續(xù)了Vector而不用Vector作為其中一個(gè)元素類型來實(shí)現(xiàn)其功能,這樣造成的結(jié)果是Stack也擁有Vector的行為,也就是說你可以把Stack當(dāng)作一個(gè)Vector來用,而這與Stack的用意毫無關(guān)系。這應(yīng)該算為Java1(1.0/1.1)中容器類庫設(shè)計(jì)者的一大失誤吧,還好,這些在Java2中都有了相當(dāng)大的改變觀。

  Hashtable也是Java1中一個(gè)有用的容器類庫。它的基本目標(biāo)是實(shí)現(xiàn)兩個(gè)或多個(gè)對象之間進(jìn)行關(guān)聯(lián)。舉一個(gè)現(xiàn)實(shí)生活中的例子,比如我們說美國白宮時(shí),指的就是在美國華盛頓的總統(tǒng)辦公大樓,為什么一說到美國白宮,總統(tǒng)辦公大樓呢?這是我們?nèi)藶榈膶Α懊绹讓m”和總統(tǒng)辦公大樓進(jìn)行了關(guān)聯(lián),本來“美國白宮”就是四個(gè)普通的文字,現(xiàn)在卻有了不同的含義。在Java中我們就可以用String定義一個(gè)內(nèi)容為“美國白宮”的對象變量,在定義一個(gè)總統(tǒng)大樓的對象變量,把它們進(jìn)行關(guān)聯(lián),這就是Hashtable的用意。通過使用pub(Object key,Object value)方法把兩個(gè)對象進(jìn)行關(guān)聯(lián),需要時(shí)用get(Object key)取得與key關(guān)聯(lián)的值對象。還可以查詢某個(gè)對象的索引值等等。值得說明的這里的get方法查找一個(gè)對象時(shí)與Vector中的get方法在內(nèi)部實(shí)現(xiàn)時(shí)有很大不同,在一個(gè)Hashtable中查找一個(gè)鍵對象要比在一個(gè)Vector中快的多。這是因?yàn)镠ashtable使用了一種哈希表的技術(shù)(在數(shù)據(jù)結(jié)構(gòu)中有具體講解),在Java每個(gè)對象缺省都有一個(gè)通過Object的hashCode()方法獲得的哈希碼,Hashtable就是利用這個(gè)哈希實(shí)現(xiàn)快速查找鍵對象的。

  Java1容器類庫設(shè)計(jì)的另一個(gè)重大失誤是竟然沒有對容器進(jìn)行排序的工具。比如你想讓Vector容器中的對象按字典順序進(jìn)行排序,你就要自己實(shí)現(xiàn)。

  雖然Java1中的容器類庫如此簡陋,卻也使Java程序員在當(dāng)時(shí)編程時(shí)省力不少,那些容器類也被大量用到,正所謂無可奈何,沒得選擇。

  可能是Java在其成長過程一直被漂亮的光環(huán)籠照著,所以它的缺點(diǎn)也被人們忽略了,幸好,在Java2中容器類庫設(shè)計(jì)者對以前的拙劣設(shè)計(jì)進(jìn)行了大刀闊斧的整改,從而使Java變得更加完美。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中国女警察一级毛片视频 | 色婷婷a | 夜夜夜操操操 | 国产精品美女久久久久久不卡 | 国产一区网址 | 91九色视频在线播放 | 伦一区二区三区中文字幕v亚洲 | 久久伊人国产精品 | 亚洲国产网址 | 久久久久久久一区 | 中文字幕精品亚洲 | 7777在线视频免费播放 | 禁漫天堂久久久久久久久久 | 欧美城网站地址 | 性片网站 | 91成人在线免费 | 91精品福利视频 | 黄色一级片免费在线观看 | 宅男噜噜噜66国产在线观看 | 91精品国产综合久久久动漫日韩 | 涩涩操| 99re色 | 特一级黄色毛片 | 99综合视频 | 2019天天干夜夜操 | 亚洲天堂在线电影 | 国产69精品久久久久久久久久 | 精品成人久久久 | 免费国产成人高清在线看软件 | 国产精品自拍啪啪 | 色a综合 | 欧美成人影院 | 中文字幕在线观看精品 | 国产亚洲精品久久久久久久久久 | 黄色片免费在线播放 | 国产精品视频一区二区三区综合 | 曰韩精品 | 国产成人精品一区二区视频免费 | 久久精品亚洲成在人线av网址 | 中文黄色一级片 | 亚洲男人的天堂在线视频 |