<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    常言笑的家

    Spring, Hibernate, Struts, Ajax, RoR

    JAVA中的集合類

    為什么要使用集合類

    當(dāng)你事先不知道要存放數(shù)據(jù)的個(gè)數(shù),或者你需要一種比數(shù)組下標(biāo)存取機(jī)制更靈活的方法時(shí),你就需要用到集合類。

    理解集合類

    集合類存放于java.util包中。
    集合類存放的都是對(duì)象的引用,而非對(duì)象本身,出于表達(dá)上的便利,我們稱集合中的對(duì)象就是指集合中對(duì)象的引用(reference)。
    集合類型主要有3種:set(集)、list(列表)和map(映射)。

    (1)集
    集(set)是最簡(jiǎn)單的一種集合,它的對(duì)象不按特定方式排序,只是簡(jiǎn)單的把對(duì)象加入集合中,就像往口袋里放東西。
    對(duì)集中成員的訪問和操作是通過集中對(duì)象的引用進(jìn)行的,所以集中不能有重復(fù)對(duì)象。
    集也有多種變體,可以實(shí)現(xiàn)排序等功能,如TreeSet,它把對(duì)象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對(duì)象序列中。它實(shí)現(xiàn)的是SortedSet接口,也就是加入了對(duì)象比較的方法。通過對(duì)集中的對(duì)象迭代,我們可以得到一個(gè)升序的對(duì)象集合。

    (2)列表
    列表的主要特征是其對(duì)象以線性方式存儲(chǔ),沒有特定順序,只有一個(gè)開頭和一個(gè)結(jié)尾,當(dāng)然,它與根本沒有順序的集是不同的。
    列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊(duì)列。
    關(guān)于實(shí)現(xiàn)列表的集合類,是我們?nèi)粘9ぷ髦薪?jīng)常用到的,將在后邊的筆記詳細(xì)介紹。

    (3)映射
    映射與集或列表有明顯區(qū)別,映射中每個(gè)項(xiàng)都是成對(duì)的。映射中存儲(chǔ)的每個(gè)對(duì)象都有一個(gè)相關(guān)的關(guān)鍵字(Key)對(duì)象,關(guān)鍵字決定了對(duì)象在映射中的存儲(chǔ)位置,檢索對(duì)象時(shí)必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的。
    關(guān)鍵字本身并不能決定對(duì)象的存儲(chǔ)位置,它需要對(duì)過一種散列(hashing)技術(shù)來處理,產(chǎn)生一個(gè)被稱作散列碼(hash code)的整數(shù)值,散列碼通常用作一個(gè)偏置量,該偏置量是相對(duì)于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對(duì)象對(duì)的存儲(chǔ)位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個(gè)關(guān)鍵字應(yīng)得到不同的散列碼。

    • 集合類簡(jiǎn)介

    java.util中共有13個(gè)類可用于管理集合對(duì)象,它們支持集、列表或映射等集合,以下是這些類的簡(jiǎn)單介紹

    集:
    HashSet:
    使用HashMap的一個(gè)集的實(shí)現(xiàn)。雖然集定義成無序,但必須存在某種方法能相當(dāng)高效地找到一個(gè)對(duì)象。使用一個(gè)HashMap對(duì)象實(shí)現(xiàn)集的存儲(chǔ)和檢索操作是在固定時(shí)間內(nèi)實(shí)現(xiàn)的.
    TreeSet: 在集中以升序?qū)?duì)象排序的集的實(shí)現(xiàn)。這意味著從一個(gè)TreeSet對(duì)象獲得第一個(gè)迭代器將按升序提供對(duì)象。TreeSet類使用了一個(gè)TreeMap.
    列表:
    Vector: 實(shí)現(xiàn)一個(gè)類似數(shù)組一樣的表,自動(dòng)增加容量來容納你所需的元素。使用下標(biāo)存儲(chǔ)和檢索對(duì)象就象在一個(gè)標(biāo)準(zhǔn)的數(shù)組中一樣。你也可以用一個(gè)迭代器從一個(gè)Vector中檢索對(duì)象。Vector是唯一的同步容器類??當(dāng)兩個(gè)或多個(gè)線程同時(shí)訪問時(shí)也是性能良好的。
    Stsck: 這個(gè)類從Vector派生而來,并且增加了方法實(shí)現(xiàn)棧??一種后進(jìn)先出的存儲(chǔ)結(jié)構(gòu)。
    LinkedList: 實(shí)現(xiàn)一個(gè)鏈表。由這個(gè)類定義的鏈表也可以像?;蜿?duì)列一樣被使用。
    ArrayList: 實(shí)現(xiàn)一個(gè)數(shù)組,它的規(guī)??勺儾⑶夷芟矜湵硪粯颖辉L問。它提供的功能類似Vector類但不同步。


    映射:
    HashTable:
    實(shí)現(xiàn)一個(gè)映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實(shí)現(xiàn)hashcode()方法和equal()方法。這個(gè)類是前面java實(shí)現(xiàn)的一個(gè)繼承,并且通常能在實(shí)現(xiàn)映象的其他類中更好的使用。
    HashMap: 實(shí)現(xiàn)一個(gè)映象,允許存儲(chǔ)空對(duì)象,而且允許鍵是空(由于鍵必須是唯一的,當(dāng)然只能有一個(gè))。
    WeakHashMap: 實(shí)現(xiàn)這樣一個(gè)映象:通常如果一個(gè)鍵對(duì)一個(gè)對(duì)象而言不再被引用,鍵/對(duì)象對(duì)將被舍棄。這與HashMap形成對(duì)照,映象中的鍵維持鍵/對(duì)象對(duì)的生命周期,盡管使用映象的程序不再有對(duì)鍵的引用,并且因此不能檢索對(duì)象。
    TreeMap: 實(shí)現(xiàn)這樣一個(gè)映象,對(duì)象是按鍵升序排列的。

    Set和List都是由公共接口Collection擴(kuò)展而來,所以它們都可以使用一個(gè)類型為Collection的變量來引用。這就意味著任何列表或集構(gòu)成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因?yàn)榭梢詮挠成浍@得一個(gè)列表。)所以說,把一個(gè)列表或集傳遞給方法的標(biāo)準(zhǔn)途徑是使用Collection類型的參數(shù)。

    • Vector 還是ArrayList,哪一個(gè)更好,為什么?

    要回答這個(gè)問題不能一概而論,有時(shí)候使用Vector比較好;有時(shí)是ArrayList,有時(shí)候這兩個(gè)都不是最好的選擇。你別指望能夠獲得一個(gè)簡(jiǎn)單肯定答案,因?yàn)檫@要看你用它們干什么。下面有4個(gè)要考慮的因素:

    (1)API

    (2)同步處理

    (3)數(shù)據(jù)增長(zhǎng)性

    (4)使用模式

    下面針對(duì)這4個(gè)方面進(jìn)行一一探討

    API
    在由Ken Arnold等編著的《Java Programming Language》(Addison-Wesley, June 2000)一書中有這樣的描述,Vector類似于ArrayList.。所有從API的角度來看這兩個(gè)類非常相似。但他們之間也還是有一些主要的區(qū)別的。

    同步性

    Vector是同步的。這個(gè)類中的一些方法保證了Vector中的對(duì)象是線程安全的。而ArrayList則是異步的,因此ArrayList中的對(duì)象并不是線程安全的。因?yàn)橥降囊髸?huì)影響執(zhí)行的效率,所以如果你不需要線程安全的集合那么使用ArrayList是一個(gè)很好的選擇,這樣可以避免由于同步帶來的不必要的性能開銷。

    數(shù)據(jù)增長(zhǎng)

    從內(nèi)部實(shí)現(xiàn)機(jī)制來講ArrayList和Vector都是使用數(shù)組(Array)來控制集合中的對(duì)象。當(dāng)你向這兩種類型中增加元素的時(shí)候,如果元素的數(shù)目超出了內(nèi)部數(shù)組目前的長(zhǎng)度它們都需要擴(kuò)展內(nèi)部數(shù)組的長(zhǎng)度,Vector缺省情況下自動(dòng)增長(zhǎng)原來一倍的數(shù)組長(zhǎng)度,ArrayList是原來的50%,所以最后你獲得的這個(gè)集合所占的空間總是比你實(shí)際需要的要大。所以如果你要在集合中保存大量的數(shù)據(jù)那么使用Vector有一些優(yōu)勢(shì),因?yàn)槟憧梢酝ㄟ^設(shè)置集合的初始化大小來避免不必要的資源開銷。

    使用模式

    在ArrayList和Vector中,從一個(gè)指定的位置(通過索引)查找數(shù)據(jù)或是在集合的末尾增加、移除一個(gè)元素所花費(fèi)的時(shí)間是一樣的,這個(gè)時(shí)間我們用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花費(fèi)的時(shí)間會(huì)呈線形增長(zhǎng):O(n-i),其中n代表集合中元素的個(gè)數(shù),i代表元素增加或移除元素的索引位置。為什么會(huì)這樣呢?以為在進(jìn)行上述操作的時(shí)候集合中第i和第i個(gè)元素之后的所有元素都要執(zhí)行位移的操作。這一切意味著什么呢?

    這意味著,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好選擇其他的集合操作類。比如,LinkList集合類在增加或移除集合中任何位置的元素所花費(fèi)的時(shí)間都是一樣的—O(1),但它在索引一個(gè)元素的使用缺比較慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因?yàn)槟憧梢院?jiǎn)單的使用索引來代替創(chuàng)建iterator對(duì)象的操作。LinkList也會(huì)為每個(gè)插入的元素創(chuàng)建對(duì)象,所有你要明白它也會(huì)帶來額外的開銷。

    最后,在《Practical Java》一書中Peter Haggar建議使用一個(gè)簡(jiǎn)單的數(shù)組(Array)來代替Vector或ArrayList。尤其是對(duì)于執(zhí)行效率要求高的程序更應(yīng)如此。因?yàn)槭褂脭?shù)組(Array)避免了同步、額外的方法調(diào)用和不必要的重新分配空間的操作。

    posted on 2006-12-22 16:07 常言笑 閱讀(299) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA/J2EE

    My Links

    Blog Stats

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 狠狠综合亚洲综合亚洲色| 日本免费高清视频| 亚洲乱码精品久久久久..| 久久国产乱子伦精品免费不卡| 亚洲酒色1314狠狠做| 成人免费777777| 久久er国产精品免费观看8| 亚洲精品国产专区91在线| 国产大片线上免费看| 国产成人无码区免费网站| 中文字幕精品三区无码亚洲| 亚洲人成网站在线观看播放| 成年免费大片黄在线观看岛国| 九九视频高清视频免费观看| 亚洲激情电影在线| 亚洲黄片手机免费观看| 在线观看视频免费完整版| 免费人成视频在线观看免费| 亚洲精品中文字幕麻豆| 中文字幕亚洲不卡在线亚瑟| 国产精品69白浆在线观看免费| 中文字幕无线码中文字幕免费| 亚洲欧美日韩综合久久久| 久久久久亚洲精品成人网小说| 四虎永久免费地址在线观看| 亚洲人成免费电影| 中国一级特黄高清免费的大片中国一级黄色片 | 粉色视频免费入口| 亚洲国产成人精品久久| 亚洲AV男人的天堂在线观看| 国产中文在线亚洲精品官网| 精品久久洲久久久久护士免费| 久久午夜无码免费| 一级特黄aaa大片免费看| 亚洲色大成网站www| 亚洲春黄在线观看| 成人免费视频88| 91av免费观看| 国产午夜成人免费看片无遮挡 | 亚洲精品无码成人片久久| 免费国产在线观看|