Java 容器綜述

在Java的util包中有兩個所有容器的父接口CollectionMap

容器特點:
1. 用於存儲對象
2. 長度是可變的
3. 不可以存儲基本數據類型值

這裏寫圖片描述

這裏寫圖片描述


Array/Arrays

Java所有“存儲及隨機訪問一連串對象”的操作,Array是最有效率的一種。
1. 效率高,但容量固定且無法動態改變。
2. Array還有一個缺點是,無法判斷其中實際存有多少元素,length只是告訴我們array的容量。
3. Java中有一個Arrays類,專門用來操作array。

Arrays中擁有一組static函數:

  • equals():比較兩個array是否相等。array擁有相同元素個數,且所有對應元素兩兩相等。
  • fill():將值填入array中。
  • sort():用來對array進行排序。
  • binarySearch():在排好序的array中尋找元素。
  • System.arraycopy():array的複製。

若寫程序時不知道究竟需要存儲多少元素,在空間不足時希望能自動擴增容量,則要使用容器類庫,Array數組不適用。


Java容器類庫用途是保存對象,分爲2類:

  • Collection
    一個獨立元素的序列,每個位置只有一個元素,這些元素都服從一條或多條規則。List必須按照插入的順序保存元素,Set不能有重複元素。Queue按照排隊規則來確定對象產生的順序(通常與插入的順序相同)。
  • Map
    存儲成對的鍵值對對象,使用鍵來查找值。映射表允許使用一個對象來查找某個對象,也被稱爲關聯數組或字典。
    另外,Map可以返回其所有組成的Set 和 其所有組成的Collection,或其鍵值對組成的Set,並且還可以像數組一樣擴展多維Map,只需讓Map中鍵值對的每個“值”是一個Map。

Iterator

迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列容器的底層實現結構。迭代器通常被稱爲“輕量級”對象,因爲創建它的代價小。

Java中的Iterator功能比較簡單,並且只能單向移動:

  • 使用iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法屬於java.lang.Iterable接口,被Collection繼承。
  • 使用next()獲得序列中的下一個元素。
  • 使用hasNext()檢查序列中是否還有元素。
  • 使用remove()將迭代器新返回的元素刪除。

Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。

List

List接口在Collection的基礎上添加了大量的方法,使得可以在List中間插入和移除元素。
ArrayListLinkedList都按照被插入的順序保存元素,區別在於執行某些操作時的性能。此外,LinkedList包含的操作也多於ArrayList。

  • ArrayList:由數組實現的List,隨機訪問元素比較快,有連續的數組空間,但是在List的中間插入和移除元素時較慢,需要大量移動內部的元素。ListIterator只應用來由後向前遍歷ArrayList,而不是用來插入和刪除元素,因爲這比LinkedList開銷要大很多。
    可以把ArrayList當做“可以自動擴充自身的數組”來看待,使用ArrayList也相當簡單:創建一個實例,用add()插入對象;然後用get()訪問這些對象,此時需要索引,就像數組一樣,但是不需要方括號。ArrayList還有一個size()方法,使你知道有多少個元素添加進來,從而不會不小心因索引越界而引發錯誤。
  • LinkedList:在LinkedList中間插入、刪除較快,提供優化的順序訪問,隨機訪問時較慢。方法比ArrayList多,如隊列以及棧的行爲,由LinkedList提供支持。如方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),這些方法(沒有在任何接口或基類中定義過)使得LinkedList可以當作堆棧、隊列和雙向隊列使用。

Set

HashSet TreeSet LinkedHashSet

每個相同的項只保存一次,即存入Set的每個元素必須是唯一的。加入Set的Object必須重寫equals()方法以確保對象的唯一性。Set與Collection有完全一樣的接口。

  1. Hashset 存儲方式複雜,能快速定位一個元素,保證了最快的獲取速度。存入HashSet的對象必須實現hashCode()
  2. TreeSet 底層爲樹結構,按照升序保存對象,使用它可以從Set中提取有序的序列。
  3. LinkedHashSet 按照添加的順序保存對象。具有HashSet的查詢速度,並且內部使用鏈表維護元素的順序(插入的次序)。在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。

HashSet採用散列函數對元素進行排序,這是專門爲快速查詢而設計的;
TreeSet採用紅黑樹的數據結構進行排序元素;
LinkedHashSet內部使用散列以加快查詢速度,同時使用鏈表維護元素的次序,使得看起來元素是以插入的順序保存的。

Map

Map主要用於存儲健值對,根據鍵得到值,因此不允許鍵重複,但允許值重複。Map.put(key,value)插入數據,Map.get(key)查找數據。不必指定Map的尺寸,因爲它會自動的調整。

Map有四個實現類,分別是HashMap Hashtable LinkedHashMap 和 TreeMap

  • Hashmap 是一個最常用的Map,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多隻允許一條記錄的鍵爲Null;允許多條記錄的值爲 Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap,可能會導致數據的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
    HashMap要比較自定義對象必須重寫equals()方法和hashCode()方法。
  • Hashtable 與 HashMap類似,不同的是:它不允許記錄的鍵或者值爲空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢。
  • LinkedHashMap 保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。在遍歷的時候會比HashMap慢。
  • TreeMap能夠把它保存的記錄根據鍵排序,默認是按升序排序,也可以指定排序比較器,當用Iterator遍歷TreeMap時,得到的記錄是排過序的。

容器類和Array的區別

  • 容器類僅能持有對象引用(指向對象的指針),而不是將對象信息copy一份至數列某位置。
  • 一旦將對象置入容器內,便損失了該對象的型別信息。

轉自:http://seaizon.iteye.com/blog/571101#comments

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章