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

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

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

    蘋果的成長日記

    我還是個青蘋果呀!

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      57 隨筆 :: 0 文章 :: 74 評論 :: 0 Trackbacks
    介紹三個集合容器庫
    ---對Java Collections Framework的補充
    作者:John Zukowski
    原文:http://www.javaworld.com/javaworld/jw-11-2002/jw-1101-collections-p1.html
    譯者:yahh
    MSN: yahh2008@hotmail.com
    摘要
    自Java 2 Platform 誕生以來,Java Collections Framework 一直是Java核心類庫的標(biāo)準(zhǔn)組成部分。如今,會發(fā)現(xiàn)起了些變化,我們有了其它的選擇,譬如Jakarta Commons Collections 和 Recursion Software 公司最新的Java Generic Library (JGL)。它們打破了Java Collections Framework 的壟斷。(November 1, 2002)

    在 Java 誕生之初,Java核心類庫僅支持幾種數(shù)據(jù)結(jié)構(gòu),包括數(shù)組(arrays)、向量(vectors) 和 hash tables(鍵-值對)。而不支持另一些重要的數(shù)據(jù)結(jié)構(gòu),比如,平衡數(shù)(balanced trees)、原始對象袋(generic bags of objects)和優(yōu)先隊列(priority queues),但是這些你都可以自己來構(gòu)建。因而,有一些開發(fā)者在類庫中加入了他們自己的數(shù)據(jù)結(jié)構(gòu)。

    在這篇文章中,我們將回顧一些開發(fā)者早期的嘗試,他們是如何發(fā)展Sun公司的Java Collections Framework的版本,以及該框架早期的進(jìn)展和在參照了用戶需求之后對一些數(shù)據(jù)結(jié)構(gòu)的支持。

    Java Collections Frameworks 的歷史
    首先,讓我們回顧一下初期的數(shù)據(jù)結(jié)構(gòu)集合,服務(wù)于紐約州立大學(xué)(在美國的Oswego)的Doug Lea,他大概是創(chuàng)立了第一個被廣泛應(yīng)用的集合(collection)。該集合在1995年秋被發(fā)布。

    那時候,一些早期的Java的開發(fā)者是由C++轉(zhuǎn)變而來。他們用Standard Template Library (STL) 進(jìn)行開發(fā),創(chuàng)立了Java 核心類庫,而該類庫極其缺乏對算法和數(shù)據(jù)結(jié)構(gòu)的支持。 一家來自C++和STL世界的公司(ObjectSpace)決定將STL接入Java。于是Java Generic Library (JGL) 在1996年發(fā)布,但是Sun并不喜歡這個名字。ObjectSpace公司因此將其改名為Generic Collection Library for Java,但仍舊使用JGL這一縮寫。
    JGL流行一時。通過營銷,ObjectSpace公司使10個IDE(集成開發(fā)環(huán)境)工具提供商集成了該類庫。ObjectSpace宣稱它的基本用戶已超過十萬人。(而那時候Java開發(fā)者還遠(yuǎn)不及七位數(shù)。)事實上JGL在Java早期成了一種標(biāo)準(zhǔn)。在幾次修訂之后,加了一個包并且與ObjectSpace的Voyager Object Request Broker (ORB) 集成,在1997年秋JGL 3.1版發(fā)布。

    隨著J2SE 1.2的到來,以及它對數(shù)據(jù)結(jié)構(gòu)支持的變化,Doug Lea 放棄了他的 collections包,開始使用公用類的第二個類庫開發(fā)。該新包提高了對數(shù)據(jù)的同步和多線程訪問。在1998年7月發(fā)布的“util.concurrent”類就提供了對鎖閉(locking)、池連(pooling)和同步(concurrent)的支持。

    Java Collections Framework
    J2SE 1.2 是在1998年12月發(fā)布的,它包括了一組稱為Java Collections Framework 的類,用來操作數(shù)據(jù)集合。對比JGL和 Collections Framework,它們有不同的目的JGL是STL的替代品,而Java Collections Framework則不是。以前的C++開發(fā)者傾向于使用JGL,那是因為JGL需要進(jìn)行深入地學(xué)習(xí),而這對于已經(jīng)熟悉STL的人更為自然。JGL大約有130個類和接口,而Collections Framework約是這個的百分之二十。

    另外一個選擇是Jakarta Commons Collections組件,于2001年7月發(fā)布,它用特制的數(shù)據(jù)類型和新方法擴展了J2SE 1.2 的APIS測試了集合論。在增添了一些類和接口的基礎(chǔ)上,Collections Framework 和 J2SE 1.4版沒有什么變化。對原型(如,模板),JSR14組織曾經(jīng)辯論過,不過沒有加入到J2SE 1.4。JSR 14 發(fā)布了一個原型,但僅在開發(fā)團體內(nèi)部受到支持。
    JSR 166 組織于去年1月出爐,由Doug Lea 領(lǐng)導(dǎo)。該組織極力將先前提及util.concurrent 類庫中的諸多高水平概念并入到Java 核心類庫中。
    Little 從ObjectSpace公司的親屬那得知,在J2SE 1.4版發(fā)布前一天一個叫Recursion Software 的公司宣稱取得了JGL版權(quán)。后來,在2002年7月,Recursion Software 公司發(fā)布了JGL 4.0版,并將JGL集合和算法與標(biāo)準(zhǔn)的Collections Framework集成。
    到了今天,我們可用的類庫有:
    l Collections Framework,它是Java 核心類庫的一部分,且定義了對所有數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的接口。
    l Jakarta Commons Collections組件,可以在Apache軟件協(xié)議下自由取得。
    l JGL 4.0
    l 對Generic-types支持,作為原型對JSR 14 可用
    l 兩個非標(biāo)準(zhǔn)的類庫(來自Doug Lea),由JSR 166 正在發(fā)展成標(biāo)準(zhǔn)。

    讓我們來看看這些類庫,考慮一下何時可能會使用它們。
    The Collections Framework
    Collection Framework 它提供了一套核心接口,共六個:Collection, Set, List, SortedSet, Map, 和 SortedMap.
    Collection 是sets和lists的基本接口。它描述了一組沒有特別特征的元素。對Collection沒有直接的實現(xiàn),僅有子接口的實現(xiàn)。
    Set是一個由一些項組成的集合,這些項不容許出現(xiàn)重復(fù)。HashSet 和 TreeSet 是兩個Set 的標(biāo)準(zhǔn)實現(xiàn);TreeSet 是經(jīng)過分類的,它實現(xiàn)了SortedSet。
    List接口是一個經(jīng)排序的集合,提供了索引或順序存取。List的實現(xiàn)包括ArrayList和LinkedList;ArrayList替代了原來的Vector類。
    Map描述了‘鍵-值’格式的集合,類似于Hashtable。可用的maps映射有HashMap和TreeMap;TreeMap是經(jīng)過分類的,它實現(xiàn)了SortedMap。J2SE 1.4 引入兩個新的實現(xiàn):LinkedHashSet和LinkedHashMap,它們內(nèi)部自動維護(hù)了在增添、搜索和刪除操作后的元素順序。J2SE 1.4 中另一個實現(xiàn)是IdentityHashMap,它用“==”代替了“equals()”來進(jìn)行等比較。對于在weak reference 感興趣的人來說,還有一個映射——WeakHashMap,它可以把WeakReference用作鍵(keys),因而,如果是通過鍵作為值(value)的唯一引用,將會丟棄該鍵-值對。
    在設(shè)計之初,基本框架是非線程安全的。多線程的同步訪問安全性需要用一個線程安全的外覆器(wrapper)來達(dá)到。這樣的一種外覆器在集合框架中有一個只讀的類似版本。
    然而,這一框架比較小,不意味著對所有數(shù)據(jù)結(jié)構(gòu)提供支持。相反,你僅僅可以通過它創(chuàng)建一些特殊的實現(xiàn)。

    The Jakarta Commons Collections 組件
    一些特定實現(xiàn)已被很好地定義與解釋,可他們卻不是核心集合框架(core Collections Framework)的一部分。其中的一些實現(xiàn)可能被包含在了同步公用類庫里,隨后我們將更為細(xì)致的討論。
    Jakarta Commons Collections 組件是這套特定實現(xiàn)的一個示例。被設(shè)計用來與J2SE 1.2 協(xié)作的Commons Collections 組件,它提供了兩個List實現(xiàn)和八個Map實現(xiàn)。新的基本結(jié)構(gòu)也是可用的而且非常有趣。
    讓我們來看一看這一組特制實現(xiàn)。
    最易理解的是FastArrayList, FastHashMap, 和 FastTreeMap。它們分別繼承了標(biāo)準(zhǔn)的ArrayList、HashMap、和TreeMap,且都提供了在多線程下安全的同步讀寫訪問。然而,安全性是需要成本的,這樣便降低了寫操作的速度。當(dāng)讀操作是非同步時,寫操作在現(xiàn)存結(jié)構(gòu)被替代時是在一份數(shù)據(jù)備份上進(jìn)行地。
    Bag就象是Set,但可以重復(fù)。另外它還有兩個實現(xiàn):HashBag和TreeBag;后者是經(jīng)排序地。
    另一個新的接口是PriorityQueue。它支持可比較項和使用比較器(Comparator),所以這些項可以BinaryHeap(基于優(yōu)先級的)來維護(hù),而且隨后可從該堆中刪除。
    剩下的就是一組特定的Map實現(xiàn)。它們提供了特殊目標(biāo)(special-purpose)、鍵-值(key-value)來查找映射(maps)。
    l BeanMap運用反射提供了鍵值對(基于JavaBean屬性);該鍵是屬性名,該值是這一屬性名的值。
    l ExtendedProperties繼承了java.util.Properties;它為單一屬性連接了多個值,而非覆寫它。
    l LRUMap是一個可維護(hù)最大容量的Map,而且使用了至少一個運算法則來定義在這一Map已滿時要移去的節(jié)點。
    l MultiHashMap有點象WeakHashMap,但它用的是SoftReference而非WeakReference。
    l DoubleOrderedMap的重點在于串。它提供了一個Map來支持快速搜索(通過值和鍵)。但有這樣一個要求:鍵和值必須都是唯一的。當(dāng)然你用兩個TreeMap對象也可以做到,但DoubleOrderedMap對每一個鍵值對僅保存一次。

    其它更多的類和接口則更多的支持角色,但仍有一些特別的方法可用。除了象isSubCollection和合并等一些公用方法外,該框架還包括了附加的Comparators和Iterators。Comparators大部分是用來連鎖或替換另一個Comparator的行為。比如說,java.util.Collections.reverseOrder()可以顛倒元素的原順序,而ReverseComparator通過一個比較器(Comparator)來顛倒順序。Iterators是在取出元素之前將每個Collection元素通過一個函數(shù)(或方法)的作用。這是JGL和STL共享的方法。

    JGL 4.0
    自1997年以來,JGL就沒有任何的更新,所以它的新版本使我很驚訝。我以為JGL已沒有了任何目的。顯然,Recursion Software賦予了它其它的目的。該公司宣布其基本用戶已超過25萬人,可是我并沒有聽說有誰在使用它。這一新版本與先前3.1版主要有三個不同之初:
    l 所有的類與接口都集成到了Collections Framework中,且同該框架一樣,默認(rèn)非同步訪問。
    l 包的名稱由com.objectspace.jgl改成了com.recursionsw.jgl。
    l Voyager-related已被廢止。
    假如你對JGL還不是很熟悉的話,請參閱JavaWorld網(wǎng)站的文章。然而,新版沒有太大的變化,類庫僅能與J2SE 1.3.1和1.4協(xié)作。你可以將Collection Framework同JGL混用。JGL還提供了獨立的抽象數(shù)據(jù)類型和法則。它支持50種預(yù)運算法則,而Collection Framework有18種。我明白為什么有人要學(xué)習(xí)兩個不同的框架,但是一個好處就是使用JGl的人可以將他們的應(yīng)用程序部分的轉(zhuǎn)移到Collections Framework中,而非所有。JGL對于原是C++的java開發(fā)者比起Collections Framework要更熟悉,但是由于JGL現(xiàn)在是該框架的一部分,這并不要緊。

    Generic types
    最早計劃要對核心集合框架的修改是去支持參數(shù)化的數(shù)據(jù)類型,又稱為原型(generics),或者是模板(templates)。現(xiàn)在所有的集合都不是型別安全的(type-safe)。你可以將任一個對象加到集合中,而且,在取出一個元素是,你必須將它適當(dāng)?shù)霓D(zhuǎn)型。如果從集合中取出你想要的型別只有在運行期才知道。JSR 14提議可以提供型別安全的集合訪問。
    在最簡單的情況下,你只能通過型別和類名的聯(lián)系去確認(rèn)正確的型別:
    public static void main(String args[]) {
    List<String> listOne = Arrays.asList(args);
    List<String> listTwo = new ArrayList<String>(listOne);
    }
    在較復(fù)雜時,你可以把型別加入類的定義中,這時類中內(nèi)部這一型別是很常見的:
    class Node<T> {
             T value;
             Node(T value) {
             this.value = value;
             }
             T getValue() {
               return value;
             }
             void setValue(T value) {
               this.value = value;
             }
          }

    對于generic-types支持的準(zhǔn)確語法,以及是否被融入到J2SE的未來版本(可能是J2SE 1.5)還要作出決定。但是,如今你能生成與任意J2SE 1.3運行環(huán)境協(xié)作的類文件。你也不用要等到J2SE 1.5,去試試JSR 14的原型方法。
    使用同步(Concurrency utilities)

    先前我提到兩個類庫(來自Doug Lea):collections和util.concurrent。后者是新類庫的第一個重?fù)簦蒍SR 166設(shè)計。從同步類庫的里外來看,JSR 16被包含在了JSR 176的計劃之內(nèi)。

    加入接受了JSR 166并加入到j(luò)ava的下一版本中,Java核心類庫體提供了非鎖閉隊列(nonblocking queue)、原子變量(atomic variables)、特定的鎖閉(some specialized locking)和定時機構(gòu)(timing mechanisms)、同步集合(concurrent collections)(類似于Commons Collections的 FastArrayList和其相關(guān)的),還有一些有趣的機制(該機制裝入每個無捕捉異常的線程控制器,而非依賴ThreadGroup)。這不是一個全包含(all-inclusive)的列表,且隸屬于JSR 166。

    注意
    如果要在你的程序中使用抽象數(shù)據(jù)類型,首先要做的是,你要了解核心集合框架。其它的都是以此為基礎(chǔ),包括JSR所建議的東西。
    一旦你了解了基本的集合類,你就能延伸到其它領(lǐng)域。當(dāng)你現(xiàn)在可以擺弄generic-types的同時,你必須等待它的最終版本以及J2SE下一版本的同步類庫。如果發(fā)現(xiàn)Jakarta Commons Collections對你很有用,一定要用它。你可以避開創(chuàng)建一般的結(jié)構(gòu)(例如multimap)。當(dāng)一個一年級的計算科學(xué)系的學(xué)生能夠完成這樣的任務(wù)時,事實上這是有益的。Apache的許可對于大多數(shù)人來說不是什么問題。

    JGL不是免費的,每一個開發(fā)者需要49.95美元。而且在你使用個別部分之前需要掌握這個類庫是如何運作的。近可能的融和JGL和Collections Framework,這可能并不是最好的選擇。一般來講,JGL就是提供了對Java核心類庫的另一選擇。我們寧愿使用Java主要類的優(yōu)化代碼,而不在我們自己的集合上包裝第三方的類庫。是的,JGL支持更多的運算法則,而且有的可能還很有用。例如,你想多么頻繁的將整數(shù)集合取負(fù)?JGL可能對那些從C++轉(zhuǎn)變來的Java開發(fā)者是有用的,但是,對于那些在用java編程的和對java感興趣的人,只了解標(biāo)準(zhǔn)集合框架的功用就行了。一般你是不需要JGL或是Commons Collections類。

    關(guān)于作者
    John Zukowski同JZ Ventures領(lǐng)導(dǎo)著關(guān)于Java的咨詢,而且是jGuru組織FAQs的成員。他的新書有Learn Java with JBuilder 6 (Apress出版) and Mastering Java 2: J2SE 1.4(Sybex出版)。
    Resources
    · Original collections library from Doug Lea:
    http://gee.cs.oswego.edu/dl/classes/collections/
    · Doug Lea's util.concurrent library:
    http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
    · Past JavaWorld article (June 1997) about JGL:
    http://www.javaworld.com/javaworld/jw-06-1997/jw-06-jgl.html
    · Past JavaWorld article (January 1999) compares JGL and the Collections Framework:
    http://www.javaworld.com/javaworld/jw-01-1999/jw-01-jglvscoll.html
    · Past JavaWorld article (November 1998) introduces the Collections Framework:
    http://www.javaworld.com/javaworld/jw-11-1998/jw-11-collections.html
    · Collections Framework Design FAQ:
    http://java.sun.com/j2se/1.4/docs/guide/collections/designfaq.html
    · Jakarta Commons Collections component:
    http://jakarta.apache.org/commons/collections.html
    · JSR 14 generic-types support:
    http://www.jcp.org/jsr/detail/14.jsp
    · JSR 14 prototype (requires free registration):
    http://developer.java.sun.com/developer/earlyAccess/adding_generics/
    · JSR 166 concurrency utilities:
    http://www.jcp.org/jsr/detail/166.jsp
    · For those interested in learning more about JSR 166:
    http://gee.cs.oswego.edu/dl/concurrency-interest/index.html
    · JSR 176 (J2SE 1.5—Tiger):
    http://www.jcp.org/jsr/detail/176.jsp
    · Java Collections book by John Zukowski (Apress, 2001; ISBN: 1893115925):
    http://www.apress.com/catalog/book/1893115925/
    · Browse the J2SE section of JavaWorld's Topical Index:
    http://www.javaworld.com/channel_content/jw-j2se-index.shtml?j2se
    · Speak out in the JavaWorld Forum:
    http://forums.devworld.com/webx?13@@.ee6b802
    · Sign up for JavaWorld's free weekly Core Java email newsletter:
    http://www.javaworld.com/subscribe
    · You'll find a wealth of IT-related articles from our sister publications at IDG.net

    posted on 2005-06-24 15:35 蘋果 閱讀(289) 評論(0)  編輯  收藏 所屬分類: J2EE/JAVA學(xué)習(xí)
    主站蜘蛛池模板: 毛片a级毛片免费观看免下载 | 13一14周岁毛片免费| 精品亚洲麻豆1区2区3区| 国产一精品一AV一免费孕妇| 又硬又粗又长又爽免费看 | 亚洲国产综合AV在线观看| 国产亚洲AV手机在线观看| 91免费国产在线观看| 添bbb免费观看高清视频| 久久国产亚洲电影天堂| 日韩免费毛片视频| 中文字幕看片在线a免费| 亚洲影视一区二区| 国产成人精品日本亚洲专区61| 99久久国产热无码精品免费| 日韩大片免费观看视频播放| 亚洲精品第五页中文字幕| 亚洲国产激情一区二区三区| 国产大片91精品免费观看不卡| 成年免费大片黄在线观看com| 亚洲不卡1卡2卡三卡2021麻豆| 国产亚洲精品高清在线| 在线jlzzjlzz免费播放| 鲁丝片一区二区三区免费| 国产偷国产偷亚洲高清人| 亚洲成a人片在线网站| 亚洲午夜福利在线观看| 国产在线观看免费不卡| 精品久久8x国产免费观看| 成全视成人免费观看在线看| 亚洲精品无码久久久久APP| 精品无码一区二区三区亚洲桃色| 亚洲第一永久AV网站久久精品男人的天堂AV| 99久在线国内在线播放免费观看| 国产精品福利片免费看| 亚洲av乱码一区二区三区按摩 | 最近的免费中文字幕视频| 色欲色香天天天综合网站免费 | 国产黄色免费观看| 亚洲av色香蕉一区二区三区蜜桃| 亚洲国产亚洲片在线观看播放|