Java2中的容器類庫

Java2中的容器類庫  自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接口提供了一組操作成批對象的方法
  它提供了基本操作如添加、刪除。它也支持查詢操作如是否爲空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對象所對應的值對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章