自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) 編輯 收藏