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

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

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

    一路拾遺
    Collect By Finding All The Way ......
    posts - 81,comments - 41,trackbacks - 0

        自java1.2之后java版本統稱為java2,java2中的容器類庫才可以說是一種真正意義上的集合框架的實現。基本完全重新設計,但是又對java1中的一些容器類庫在新的設計上進行了保留,這主要是為了向下兼容的目的,當用java2開發程序時,應盡量避免使用它們,java2的集合框架已經完全可以滿足你的需求。有一點需要提醒的是,在java1中容器類庫是同步化的,而java2中的容器類庫都是非同步化,這可能是對執行效率進行考慮的結果。
    java2中的集合框架提供了一套設計優良的接口和類,使程序員操作成批的數據或對象元素極為方便。這些接口和類有很多對抽象數據類型操作的api,而這是我們常用的且在數據結構中熟知的。例如maps,sets,lists,arrays等。并且java用面向對象的設計對這些數據結構和算法進行了封裝,這就極大的減化了程序員編程時的負擔。程序員也可以以這個集合框架為基礎,定義更高級別的數據抽象,比如棧、隊列和線程安全的集合等,從而滿足自己的需要。
    java2的集合框架,抽其核心,主要有三類:list、set和map。

        其中,list和set繼承了collection,而map則獨成一體。初看上去可能會對map獨成一體感到不解,它為什么不也繼承collection呢?但是仔細想想,這種設計是合理的。一個map提供了通過key對map中存儲的value進行訪問,也就是說它操作的都是成對的對象元素,比如put()和get()方法,而這是一個set或list所不就具備的。當然在需要時,你可以由keyset()方法或values()方法從一個map中得到鍵的set集或值的collection集。
    1、collection接口提供了一組操作成批對象的方法,用uml表示的方法列表如下:
    它提供了基本操作如添加、刪除。它也支持查詢操作如是否為空isempty()方法等。為了支持對collection進行獨立操作,java的集合框架給出了一個iterator,它使得你可以泛型操作一個collection,而不需知道這個collection的具體實現類型是什么。它的功能與java1中的enumeration類似,只是更易掌握和使用,功能也更強大。在建立集合框架時,SUN的開發團隊考慮到需要提供一些靈活的接口,用來操作成批的元素,又為了設計的簡便,就把那些對集合進行可選操作的方法與基本方法放到了一起。因為一個接口的實現者必須提供對接口中定義的所有方法的實現,這就需要一種途徑讓調用者知道它正在調用 的可選方法當前不支持。最后開發團隊選擇使用一種信號,也即拋出一種不支持操作例外(unsupportedoperationexception),如果你在使用一個collection中遇到一個上述的例外,那就意味著你的操作失敗,比如你對一個只讀collection添加一個元素時,你就會得到一個不支持操作例外。在你實現一個集合接口時,你可以很容易的在你不想讓用戶使用的方法中拋出unsupportoperationexception來告訴使用者這個方法當前沒有實現,unsupportoperationexception是runtimeexception的一個擴展。
    另外java2的容器類庫還有一種fail fast的機制。比如你正在用一個iterator遍歷一個容器中的對象,這時另外一個線程或進程對那個容器進行了修改,那么再用next()方法時可能會有災難性的后果,而這是你不愿看到的,這時就會引發一個concurrentmodificationexception例外。這就是fail-fast。
    2、list接口對collection進行了簡單的擴充,它的具體實現類常用的有arraylist和linkedlist。你可以將任何東西放到一個list容器中,并在需要時從中取出。arraylist從其命名中可以看出它是一種類似數組的形式進行存儲,因此它的隨機訪問速度極快,而linkedlist的內部實現是鏈表,它適合于在鏈表中間需要頻繁進行插入和刪除操作。在具體應用時可以根據需要自由選擇。前面說的iterator只能對容器進行向前遍歷,而listiterator則繼承了iterator的思想,并提供了對list進行雙向遍歷的方法。
    3、set接口也是collection的一種擴展,而與list不同的時,在set中的對象元素不能重復,也就是說你不能把同樣的東西兩次放入同一個set容器中。它的常用具體實現有hashset和treeset類。hashset能快速定位一個元素,但是你放到hashset中的對象需要實現hashcode()方法,它使用了前面說過的哈希碼的算法。而treeset則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外兩個實用類comparable和comparator。一個類是可排序的,它就應該實現comparable接口。有時多個類具有相同的排序算法,那就不需要在每分別重復定義相同的排序算法,只要實現comparator接口即可。
    集合框架中還有兩個很實用的公用類:collections和arrays。collections提供了對一個collection容器進行諸如排序、復制、查找和填充等一些非常有用的方法,arrays則是對一個數組進行類似的操作。
    4、map是一種把鍵對象和值對象進行關聯的容器,而一個值對象又可以是一個map,依次類推,這樣就可形成一個多級映射。對于鍵對象來說,像set一樣,一個map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性;如果有兩個鍵對象一樣,那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到的并不是你想的那個值對象,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值對象可能會發生變化,這時會按照最后一次修改的值對象與鍵對應。對于值對象則沒有唯一性的要求。你可以將任意多個鍵都映射到一個值對象上,這不會發生任何問題(不過對你的使用卻可能會造成不便,你不知道你得到的到底是那一個鍵所對應的值對象)。map有兩種比較常用的實現:hashmap和treemap。hashmap也用到了哈希碼的算法,以便快速查找一個鍵,treemap則是對鍵按序存放,因此它便有一些擴展的方法,比如firstkey(),lastkey()等,你還可以從treemap中指定一個范圍以取得其子map。鍵和值的關聯很簡單,用pub(object key,object value)方法即可將一個鍵與一個值對象相關聯。用get(object key)可得到與此key對象所對應的值對象。
    本文來自學習網(www.gzu521.com),原文地址:http://www.gzu521.com/campus/article/program/200602/14354.htm

    posted on 2009-11-16 19:05 胖胖泡泡 閱讀(111) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 无码av免费一区二区三区试看| 日本高清免费中文在线看| 久久大香伊焦在人线免费| 久久精品亚洲乱码伦伦中文| 免费一区二区无码视频在线播放 | 亚洲精品无码久久久久久| 99久久久精品免费观看国产| 亚洲毛片无码专区亚洲乱| 永久在线观看www免费视频| 亚洲第一页在线播放| 2021免费日韩视频网| 最新亚洲春色Av无码专区| 女人张腿给男人桶视频免费版| 亚洲日本人成中文字幕| 日本高清免费不卡在线| 免费人成大片在线观看播放电影| 免费吃奶摸下激烈视频| 国产精品免费久久久久影院| 亚洲成a人片77777kkkk| 亚洲一级毛片免费看| 亚洲第一综合天堂另类专| 狠狠亚洲狠狠欧洲2019| 免费91最新地址永久入口| 亚洲女人初试黑人巨高清| 热99re久久精品精品免费| h视频在线观看免费| 亚洲久本草在线中文字幕| 57PAO成人国产永久免费视频| 亚洲精品乱码久久久久久V| 国产国拍亚洲精品福利| 亚洲视频在线免费播放| 亚洲AV永久无码精品网站在线观看| 亚洲AV无码一区二区三区在线观看 | 精品无码免费专区毛片| 久久久亚洲精华液精华液精华液| 狠狠亚洲婷婷综合色香五月排名| 88av免费观看| 噜噜噜亚洲色成人网站| 久久亚洲熟女cc98cm| 亚洲av高清在线观看一区二区| 久久久久国色av免费看|