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

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

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

    javaGrowing

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評(píng)論 :: 0 Trackbacks
    認(rèn)識(shí).NET的集合 - 開發(fā)者 - ZDNet China


    認(rèn)識(shí).NET的集合

    作者: BUILDER.COM
    Wednesday, May 15 2002 11:06 AM

     集合(collection)提供了一種結(jié)構(gòu)化組織任意對(duì)象的方式,而且我們?cè)缇椭兰显谌粘>幊坦ぷ髦械闹匾浴?NET類庫提供了豐富的集合數(shù)據(jù)類型,其種類之繁多甚至使許多人看得眼都花了,這些集合對(duì)象都具有各自的專用場合。不管怎么說,更多的選擇也就意味著更高的靈活性,但同時(shí)也意味著更高的復(fù)雜性。因此,對(duì)集合各個(gè)類型的用途和使用條件具有適度的了解是完全必要的。下面就請(qǐng)隨我進(jìn)行一場.NET集合之旅吧!

    .NET集合定義


    從.NET的角度看,所謂的集合可以定義為一種對(duì)象,這種對(duì)象實(shí)現(xiàn)一個(gè)或者多個(gè)System.Collections.ICollection、System.Collections.IDictionarySystem.Collections.IList接口。這一定義把System.Collections名稱空間中的“內(nèi)置”集合劃分成了三種類別:

    • 有序集合:僅僅實(shí)現(xiàn)ICollection接口的集合,在通常情況下,其數(shù)據(jù)項(xiàng)目的插入順序控制著從集合中取出對(duì)象的的順序。System.Collections.Stack和 System.Collections.Queue類都是ICollection集合的典型例子。
    • 索引集合:實(shí)現(xiàn)Ilist的集合,其內(nèi)容能經(jīng)由從零開始的數(shù)字檢索取出,就象數(shù)組一樣。System.Collections.ArrayList對(duì)象是索引集合的一個(gè)例子。
    • 鍵式集合:實(shí)現(xiàn) IDictionary 接口的集合,其中包含了能被某些類型的鍵值檢索的項(xiàng)目。IDictionary集合的內(nèi)容通常按鍵值方式存儲(chǔ),可以用枚舉的方式排序檢索。 System.Collections.HashTable類實(shí)現(xiàn)了IDictionary 接口。

    正如你看到的那樣,給定集合的功能在很大程度上受到特定接口或其實(shí)現(xiàn)接口的控制。如果你對(duì)面向?qū)ο缶幊倘狈α私?,那么你可能?duì)上面說的這些話感到難以理解。不過你至少應(yīng)該知道,以接口這種方式構(gòu)造對(duì)象的功能不但造就了具有整套類似方法的對(duì)象族,而且還能讓這些對(duì)象在必要的情況下可以當(dāng)作同類,以O(shè)OP(面向?qū)ο缶幊蹋┑男g(shù)語來說,這就是大名鼎鼎的多態(tài)性技術(shù)。

    System.Collections概述

    System.Collections名稱空間包含了在你的應(yīng)用程序中可以用到的6種內(nèi)建通用集合。另一些更為專業(yè)化的集合則歸屬于System.Collections.Specialized,在某些情況下你會(huì)發(fā)現(xiàn)這些專用集合也是非常有用的。加上一些異常(exception)類,這些專業(yè)化集合在功能上和內(nèi)建集合是類似的?,F(xiàn)在就讓我們審視一下通用集合以及少量的不太富于專業(yè)化的集合。

    堆棧和隊(duì)列

    System.Collections.Stack 和 System.Collections.Queue 類,兩者僅僅實(shí)現(xiàn)了ICollection 接口,按照存儲(chǔ)項(xiàng)目加到集合的順序保存System.Object類型的項(xiàng)目。對(duì)象只能按其加入順序從集合中檢索:堆棧是后進(jìn)先出,而隊(duì)列則是先進(jìn)先出。通常情況下,你在以下場合可以考慮采用以上這些集合:

    • 接收和處理集合內(nèi)項(xiàng)目時(shí)順序比較重要。
    • 你能在處理項(xiàng)目之后丟棄它。
    • 你不需要訪問集合中的任意項(xiàng)目。

    ArrayList

    System.Collections.ArrayList類,僅僅實(shí)現(xiàn) Ilist,最適合描述為一種正常數(shù)組和集合的混合類型。ArrayList按照項(xiàng)目被加入集合的順序存儲(chǔ)項(xiàng)目。每個(gè)項(xiàng)目都被分配一個(gè)索引標(biāo)識(shí)符而且能由關(guān)聯(lián)它們的索引數(shù)字以任何順序被檢索。當(dāng)新項(xiàng)目加入集合時(shí)會(huì)擴(kuò)大ArrayList從而令其相比普通數(shù)組更具靈活性。然而,ArrayList負(fù)載比傳統(tǒng)數(shù)組更大而且沒有實(shí)現(xiàn)嚴(yán)格的類型化,也就可以接受任何轉(zhuǎn)換為System.Object的對(duì)象(換句話說,對(duì)什么東西都來者不拒)。

    SortedList

    System.Collections.SortedList,它實(shí)現(xiàn)了IDictionary和ICollection接口,是最基本的排序集合,與Vb6下的Collection對(duì)象非常類似。SortedList存儲(chǔ)對(duì)象并按照關(guān)聯(lián)的鍵值對(duì)這些存儲(chǔ)對(duì)象排序。它們也是同時(shí)支持索引數(shù)字和鍵對(duì)象檢索的唯一內(nèi)建的.NET集合。

    HashTable

    強(qiáng)有力的System.Collections.HashTable集合實(shí)現(xiàn)了IDictionary 和 Icollection,能用來存儲(chǔ)多種類型的對(duì)象連同關(guān)聯(lián)的唯一字符串鍵值。在HashTable集合中的項(xiàng)目按照源自其鍵值的哈希代碼所確定的順序存儲(chǔ)。集合內(nèi)每個(gè)對(duì)象的鍵值都必須唯一,而其哈希代碼則不一定唯一。


    什么是哈希代碼?
    哈希代碼實(shí)質(zhì)上就是從一快數(shù)據(jù)中消除所有冗余部分之后的結(jié)果,它主要起到對(duì)數(shù)據(jù)輔助分類或排序的作用。

    當(dāng)某個(gè)項(xiàng)目加入集合時(shí),HashTable即調(diào)用鍵值的GetHashCode方法,由于所有的類都是從System.Objec繼承的,所以調(diào)用該方法即可確定該類的哈希代碼并且按該代碼排序存儲(chǔ)。你可以強(qiáng)迫使用定制的哈希函數(shù),方法有二,一是重載類的GetHashCode方法,二是向HashTable構(gòu)造器傳遞實(shí)現(xiàn)了System.Collections.IHashcodeProvider接口的對(duì)象,在這種情況下,該對(duì)象將用于為所有加入集合的鍵值產(chǎn)生哈希代碼。

    從性能的角度看,因?yàn)殒I值搜索僅限于具有同樣哈希代碼的鍵值,所以HashTable能夠很快地從集合中檢索任意一個(gè)元素,從而減少了必須通過檢查以發(fā)現(xiàn)匹配的鍵值的數(shù)量。然而,因?yàn)椴迦氲郊现械拿總€(gè)對(duì)象-鍵值對(duì)都必須產(chǎn)生相應(yīng)的哈希代碼,所以項(xiàng)目插入的代價(jià)就有點(diǎn)高了。因此,HashTable主要運(yùn)用在按照任意鍵值反復(fù)檢索大量相對(duì)靜態(tài)的數(shù)據(jù)這一場合下。

    ListDictionary 和 HybridDictionary

    ListDictionary 和 HybridDictionary 類歸屬于System.Collections.Specialized。它們都在按照唯一鍵值的原則來組織項(xiàng)目,而且都實(shí)現(xiàn)了 IDictionary 和 ICollection 。ListDictionary在內(nèi)部以鏈表的方式存儲(chǔ)項(xiàng)目,建議用在不會(huì)增長超過10個(gè)項(xiàng)目的集合中。HybridDictionary采用一個(gè)內(nèi)部鏈表(實(shí)際上就是ListDictionary)作為小集合,當(dāng)集合變得足夠大(超過10個(gè)項(xiàng)目)以至于鏈表實(shí)現(xiàn)效率降低時(shí)就會(huì)轉(zhuǎn)換為HashTable。

    StringCollection 和 StringDictionary

    System.Collections.Specialized.StringCollection 和 System.Collections.Specialized.StringDictionary 都對(duì)存儲(chǔ)字符串的集合進(jìn)行了優(yōu)化。 StringCollection實(shí)現(xiàn)了 IList 和 ICollection 而且實(shí)質(zhì)上就是ArrayList,只不過實(shí)現(xiàn)了強(qiáng)烈的類型化僅僅接受字符串而已。StringCollection最理想的應(yīng)用場合是經(jīng)常更新或增加的少量數(shù)據(jù),而StringDictionary則最適用于不經(jīng)常增加項(xiàng)目到諸如HashTable之類集合中的大量數(shù)據(jù)。

    NameValueCollection

    System.Collections.Specialized.NameValueCollection最有趣的地方在于它能包含關(guān)聯(lián)同一鍵值的多個(gè)項(xiàng)目,這正是它與其他內(nèi)建集合的差別所在。除此以外,它在功能上類似HashTable,按照源自每一項(xiàng)目鍵值的哈希代碼對(duì)項(xiàng)目排序從而也具有類同的優(yōu)缺點(diǎn)。

    存在的問題

    如果說由 .NET 類庫所提供的內(nèi)建集合也存在問題的話,那多半是它們幾乎都在內(nèi)部把項(xiàng)目存儲(chǔ)為System.Object.類型。從最大靈活性的角度看那是一個(gè)好想法,但同時(shí)也給采用這些通用集合的程序員提出了一些問題。首先,只要你把一個(gè)新項(xiàng)目加到集合中去,運(yùn)行時(shí)就必須實(shí)施類型轉(zhuǎn)換操作(創(chuàng)建值類型的索引以便可以當(dāng)作對(duì)象引用)。這是一種低效的操作而且在處理大型集合時(shí)會(huì)產(chǎn)生相當(dāng)可觀的性能問題。其次,只要你訪問通用集合中的一個(gè)項(xiàng)目,該項(xiàng)目都將作為System.Object類型被返回,這就意味著你不得不把它轉(zhuǎn)換為真實(shí)的類型才能對(duì)其進(jìn)行有意義的操作。

    責(zé)任編輯:炒飯

    posted on 2005-12-09 11:32 javaGrowing 閱讀(361) 評(píng)論(0)  編輯  收藏 所屬分類: java 學(xué)習(xí)
    主站蜘蛛池模板: 久久精品国产亚洲AV无码娇色 | 国产麻豆剧传媒精品国产免费| 亚洲国产综合精品中文第一| 四虎影视免费永久在线观看| 在线观看免费播放av片| 亚洲激情黄色小说| 亚洲国产理论片在线播放| 成人黄软件网18免费下载成人黄18免费视频 | 日韩精品人妻系列无码专区免费| 久久久久亚洲AV成人网人人网站| aⅴ在线免费观看| 成人嫩草影院免费观看| 亚洲精品97久久中文字幕无码| 99精品一区二区免费视频| 亚洲av日韩专区在线观看| 最近中文字幕mv手机免费高清| 国产黄在线播放免费观看| 亚洲av无码不卡久久| 免费视频专区一国产盗摄| 亚洲校园春色另类激情| 最近最好的中文字幕2019免费 | 在线精品亚洲一区二区小说| 无码日韩精品一区二区免费| 十八禁在线观看视频播放免费| 最新亚洲春色Av无码专区| 亚洲AV成人一区二区三区AV| 免费a级毛片网站| 美女网站免费福利视频| 男的把j放进女人下面视频免费| 亚洲人JIZZ日本人| 国产成人3p视频免费观看| 久久成人国产精品免费软件| 黄色网站软件app在线观看免费| 国产精品亚洲а∨无码播放不卡 | 一级毛片免费毛片毛片| 亚洲成年轻人电影网站www| heyzo亚洲精品日韩| 久久久久久久久久免免费精品| 亚洲视频在线观看免费视频| 成人免费a级毛片无码网站入口| 亚洲综合中文字幕无线码|