標籤:get 序列化 tab api ges 函數 遍曆 映射 清空
Java集合類及其資料結構歸納 - s小小的我 - 部落格園
http://www.cnblogs.com/shidejia/p/6433788.html
上面這張圖總結了java集合類的繼承結構,下面是對集合類的一些總結和特性描述:
Collection
Collection是一個介面,是高度抽象出來的集合,它包含了集合的基本操作:添加、刪除、清空、遍曆、是否為空白、擷取大小、是否保護某元素等等。
Collection介面的所有子類(直接子類和間接子類)都必須實現2種建構函式:不帶參數的建構函式和參數為Collection的建構函式。帶參數的建構函式,可以用來轉換Collection的類型。
AbstractCollection
AbstractCollection是一個抽象類別,它實現了Collection中除iterator()和size()之外的函數。由於它實現了Collection介面中的大部分函數,從而方便其它類實現Collection,比如ArrayList、LinkedList等,它們這些類想要實現Collection介面,通過繼承AbstractCollection就已經實現了大部分的介面了。
List
List是一個繼承於Collection的介面。
List是有序的隊列,List中的每一個元素都有一個索引。第一個元素的索引值是0,往後的元素的索引值依次+1。
和Set不同,List中允許有重複的元素。
既然List是繼承於Collection介面,它包含了Collection中的全部函數介面;由於List是有序隊列,它也額外的有自己的API介面。主要有“添加、刪除、擷取、修改指定位置的元素”、“擷取List中的子隊列”等。
List中有listIterator()方法,List的實作類別都要實現listIterator()方法,返回一個ListIterator對象。
ListIterator是一個繼承於Iterator的介面,它是隊列迭代器。專門用於便利List,能提供向前/向後遍曆。相比於Iterator,它新增了添加、是否存在上一個元素、擷取上一個元素等等API介面。
AbstractList
AbstractList是一個繼承於AbstractCollection,並且實現List介面的抽象類別。
它實現了List中除size()、get(int location)之外的函數。由於它實現了List介面中的大部分函數,從而方便其它類繼承List。AbstractList和AbstractCollection相比,AbstractList抽象類別中實現了iterator()介面。
ArrayList
ArrayList繼承了AbstractList抽象類別,實現了List介面。
它是一個數組隊列,相當於動態數組。與Java中的數組相比,它的容量能動態增長。
ArrayList還實現了RandomAccess(提供了隨機訪問功能:即可以通過元素的序號快速擷取元素對象), Cloneable(能被複製), java.io.Serializable(支援序列化,能通過序列化去傳輸)這些介面。
ArrayList中是非安全執行緒的,所以在單線程中才使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList。
LinkedList
LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表,可以被當作堆棧、隊列或雙端隊列進行操作。
LinkedList同時還實現了List、Deque(雙端隊列)、Cloneable(能複製)、java.io.Serializable(支援序列化,能通過序列化去傳輸)等介面。LinkedList是非同步的。
Vector
Vector 是向量隊列,它是JDK1.0版本添加的類。繼承於AbstractList,實現了List(支援相關的添加、刪除、修改、遍曆等), RandomAccess(隨機訪問功能), Cloneable(能被複製)這些介面。
Vector實際上是通過一個數組去儲存資料的。當我們構造Vecotr時;若使用預設建構函式,則Vector的預設容量大小是10。
當Vector容量不足以容納全部元素時,Vector的容量會增加。若容量增加係數 >0,則將容量的值增加“容量增加係數”;否則,將容量大小增加一倍。
Vector的複製函數,即是將全部元素複製到一個數組中。和ArrayList不同,Vector中的操作是安全執行緒的。
Stack
Stack是棧。它的特性是:先進後出(FILO, First In Last Out)。
Stack繼承於Vector(向量隊列)的,由於Vector是通過數組實現的,這就意味著,Stack也是通過數組實現的,而非鏈表。
Set
Set是一個繼承於Collection的介面。Set是沒有重複元素的集合。
AbstractSet
AbstractSet是一個繼承於AbstractCollection,並且實現Set介面的抽象類別。它實現了Set介面中的大部分函數,從而方便其它類實現Set介面。
HashSet
HashSet 是一個沒有重複元素的集合,繼承於AbstractSet,並且實現了Set介面。
它是由HashMap實現的,HashSet中含有一個HashMap類型的成員變數map,HashSet的操作函數,實際上都是通過map實現的。HashMap不保證元素的順序,而且HashSet允許使用 null 元素。HashSet是非同步的。
TreeSet
TreeSet是一個有序的集合,它是通過TreeMap實現的,TreeSet中含有一個NavigableMap類型的成員變數m,而m實際上是TreeMap的執行個體。
TreeMap繼承於AbstractSet(具有Set的屬性和方法)抽象類別,實現了NavigableSet(支援一系列的導航方法,比如尋找與指定目標最匹配項), Cloneable(能被複製), java.io.Serializable(支援序列化,能通過序列化去傳輸。當寫入到輸出資料流時,依次寫入“比較子、容量、全部元素”;當讀出輸入資料流時,再依次讀取。)介面。
TreeSet是基於TreeMap實現的。TreeSet中的元素支援2種排序方式:自然排序或者根據建立TreeSet時提供的Comparator進行排序。這取決於使用的構造方法。
TreeSet為基本操作(add、remove 和 contains)提供受保證的 log(n) 時間開銷。
TreeSet是非同步的,即非安全執行緒的。 它的iterator 方法返回的迭代器是fail-fast的。
Map
Map是一個索引值對(key-value)映射介面。Map映射中不能包含重複的鍵;每個鍵最多隻能映射到一個值。
Map提供介面分別用於返回鍵集、值集或鍵-值對應關係集:
entrySet()用於返回鍵-值集的Set集合;
keySet()用於返回鍵集的Set集合;
values()使用者傳回值集的Collection集合。
因為Map中不能包含重複的鍵;每個鍵最多隻能映射到一個值。所以,鍵-值集、鍵集都是Set,值集時Collection。
Map提供了“鍵-值對”、“根據鍵擷取值”、“刪除鍵”、“擷取容量大小”等方法。
AbstractMap
AbstractMap類提供Map介面的骨幹實現,以最大限度地減少實現此介面所需的工作。
SortedMap
SortedMap是一個繼承於Map介面的介面。它是一個有序的SortedMap索引值映射。
SortedMap的排序方式有兩種:自然排序或者使用者指定比較子。插入有序 SortedMap的所有元素都必須實現Comparable介面(或者被指定的比較子所接受)。
NavigableMap
NavigableMap是繼承於SortedMap的介面。它是一個可導航的鍵-值對集合,具有了為給定搜尋目標報告最接近匹配項的導航方法。
NavigableMap分別提供了擷取“鍵”、“鍵-值對”、“鍵集”、“鍵-值對集”的相關方法。
HashMap
HashMap是一個散列表,它儲存的內容是索引值對(key-value)映射。
HashMap繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable介面。
HashMap的實現不是同步的,這意味著它不是安全執行緒的。它的key、value都可以為null。此外,HashMap中的映射不是有序的。
TreeMap
TreeMap實現SortedMap介面,能夠把它儲存的記錄根據鍵排序,預設是按索引值的升序排序,也可以指定排序的比較子,當用Iterator 遍曆TreeMap時,得到的記錄是排過序的。
TreeMap基於紅/黑樹狀結構(Red-Black tree)實現。該映射根據其鍵的自然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。
Hashtable
Hashtable與HashMap類似,Hashtable繼承自Dictionary類,實現了Map介面,不同的是它不允許記錄的鍵或者值為空白;和HashMap相比,Hashtable是線程同步的,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。而且Hashtable可以通過Enumeration去遍曆。
LinkedHashMap
LinkedHashMap儲存了記錄的插入順序,在用Iterator遍曆LinkedHashMap時,先得到的記錄肯定是先插入的。也可以在構造時用帶參數,按照應用次數排序。在遍曆的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際資料較少時,遍曆起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍曆速度只和實際資料有關,和容量無關,而HashMap的遍曆速度和他的容量有關。
Enumeration和Iterator比較:
(01) 函數介面不同
Enumeration只有2個函數介面。通過Enumeration,我們只能讀取集合的資料,而不能對資料進行修改。
Iterator只有3個函數介面。Iterator除了能讀取集合的資料之外,也能資料進行刪除操作。
(02) Iterator支援fail-fast機制,而Enumeration不支援。
Enumeration 是JDK 1.0添加的介面。使用到它的函數包括Vector、Hashtable等類,這些類都是JDK 1.0中加入的,Enumeration存在的目的就是為它們提供遍曆介面。Enumeration本身並沒有支援同步,而在Vector、Hashtable實現Enumeration時,添加了同步。
而Iterator 是JDK 1.2才添加的介面,它也是為了HashMap、ArrayList等集合提供遍曆介面。Iterator是支援fail-fast機制的:當多個線程對同一個集合的內容進行操作時,就可能會產生fail-fast事件。
(4)java資料結構--集合類及其資料結構歸納