(4)java資料結構--集合類及其資料結構歸納

來源:互聯網
上載者:User

標籤: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資料結構--集合類及其資料結構歸納

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.