標籤:anything 空間 繼承 獲得 ash 類型轉換 事先 映射 null
早在Java 2中之前,Java就提供了特設類。比如:向量(Vector)、棧(Stack)、字典(Dictionary)、雜湊表(Hashtable)這些類(資料結構)用來儲存和操作對象組。雖然這些類都非常有用,但是它們缺少一個核心的,統一的主題。集合架構是為表示和操作集合而規定的一種統一的標準的體繫結構。除了集合,該架構(framework)也定義了幾個Map介面和類。Map裡儲存的是鍵/值對。儘管Map不是collections,但是它們完全整合在集合中。
所有的集合架構都包含如下內容:
- 介面:是代表集合的抽象資料類型。介面允許集合獨立操縱其代表的細節。在物件導向的語言,介面通常形成一個層次。
- 實現(類):是集合介面的具體實現。從本質上講,它們是可重複使用的資料結構。
- 演算法:是實現集合介面的對象裡的方法執行的一些有用的計算,例如:搜尋和排序。這些演算法被稱為多態,那是因為相同的方法可以在相似的介面上有著不同的實現。
集合架構的類和介面均在java.util包中。
是簡化的集合架構關係圖:
集合介面
整個集合架構就圍繞一組標準介面而設計。你可以直接使用這些介面的標準實現,諸如: LinkedList, HashSet, 和 TreeSet等,除此之外你也可以通過這些介面實現自己的集合。具體介面及其概述如下:
| 名稱 |
概述 |
| Collection |
Collection 是最基本的集合介面,一個 Collection 代表一組 Object,Java不提供直接繼承自Collection的類,只提供繼承於的子介面(如List和set)。 |
| List |
List介面是一個有序的Collection,使用此介面能夠精確的控制每個元素插入的位置,能夠通過索引(元素在List中位置,類似於數組的小標)來訪問List中的元素,而且允許有相同的元素。 |
| Set |
Set 具有與 Collection 完全一樣的介面,只是行為上不同,Set 不儲存重複的元素。 |
| SortedSet |
繼承於Set儲存有序的集合。 |
| Map |
將唯一的鍵映射到值。 |
| Map.Entry |
描述在一個Map中的一個元素(鍵/值對)。是一個Map的內部類。 |
| SortedMap |
繼承於Map,使Key保持在升序排列。 |
| Enumeration |
這是一個傳統的介面和定義的方法,通過它可以枚舉(一次獲得一個)對象集合中的元素。這個傳統介面已被迭代器取代。 |
更多參見:線上文檔-jdk-zh。
集合實作類別
| 集合類型 |
描述 |
| ArrayList |
一種可以動態增長和縮減的索引序列 |
| LinkedList |
一種可以在任何位置進行高效地插入和刪除操作的有序序列 |
| ArrayDeque |
一種用迴圈數組實現的雙端隊列 |
| HashSet |
一種沒有重複元素的無序集合 |
| TreeSet |
一種有序集 |
| EnumSet |
一種包含枚舉類型值的集 |
| LinkedHashSet |
一種可以記住元素插入次序的集 |
| PriorityQueue |
一種允許高效刪除最小元素的集合 |
| HashMap |
一種儲存鍵/值關聯的資料結構 |
| TreeMap |
一種索引值有序排列的映射表 |
| EnumMap |
一種索引值屬於枚舉類型的映射表 |
| WeakHashMap |
一種其值誒用武之地後可以被記憶體回收行程回收的映射表 |
| LinkedHashMap |
一種可以記住鍵/值項添加次序的映射表 |
| IdentityHashMap |
一種用==,而不是用equals比較索引值的映射表 |
另外還有一組名字以Abstract開頭的類,例如,AbstractQueue,這些類是為類庫實現者而設計的,用來實現自己的資料結構。
常用資料結構
- 向量(Vector)
Vector類實現了一個動態數組。和ArrayList和相似,但是Vector是同步訪問的(同步操作會耗費大量時間,建議在不需要同步時使用ArrayList),而且Vector包含了許多傳統的方法,這些方法不屬於集合架構。Vector主要用在事先不知道數組的大小,或者只是需要一個可以改變大小的數組的情況。需要注意的是向量中的資料被轉化為Object對象,取出元素使用時要強制轉化為原來的類型。
Vector類支援4種構造方法:
常用方法:
| 方法 |
描述 |
| boolean add(E e) |
將指定元素添加到此向量的末尾。 |
| void add(int index, E element) |
在此向量的指定位置插入指定的元素。 |
| E remove(int index) |
移除此向量中指定位置的元素。 |
| boolean remove(Object o) |
移除此向量中指定元素的第一個匹配項,不包含則元素保持不變。 |
| E set(int index, E element) |
用指定的元素替換此向量中指定位置處的元素。 |
| void setElementAt(E obj, int index) |
將此向量指定 index 處的組件設定為指定的對象。 |
| E get(int index) |
返迴向量中指定位置的元素。 |
| int indexOf(Object o) |
返回此向量中第一次出現的指定元素的索引,不包含則返回 -1。 |
| boolean isEmpty() |
測試此向量是否不包含組件。 |
| void clear() |
從此向量中移除所有元素。 |
| int capacity() |
返回此向量的當前容量。 |
| boolean contains(Object o) |
如果此向量包含指定的元素,則返回 true。 |
| void setSize(int newSize) |
設定此向量的大小。 |
| void trimToSize() |
對此向量的容量進行微調,使其等於向量的當前大小。 |
Vector還定義了很多其他方法,具體可以看:Java Vector 類。
- 雜湊表(Hashtable)
Hashtable(確實是小寫t)是原始的java.util的一部分, 是一個Dictionary具體的實現 。然而,Java 2 重構的Hashtable實現了Map介面,因此,Hashtable現在整合到了集合架構中。它和HashMap類很相似,但是它支援同步(同樣建議不需要同步時使用HashMap)。像HashMap一樣,Hashtable在雜湊表中儲存鍵/值對。當使用一個雜湊表,要指定用作鍵的對象,以及要連結到該鍵的值。然後,該鍵經過雜湊處理,所得到的散列碼被用作儲存在該表中值的索引。
Hashtable定義了四個構造方法:
如果散列表的裝載因子是0.75,那麼當散列表的容量被使用了75%時,就會自動將容量增加到原始容量的2倍。通常,預設載入因子(0.75)在時間和空間成本上尋求一種折中,裝載因子過高雖然減少了空間開銷,但同時也增加了尋找某個條目的時間。
常用方法:
| 方法 |
描述 |
| V put(K key, V value) |
將指定 key 映射到此雜湊表中的指定 value。 |
| V remove(Object key) |
從雜湊表中移除該鍵及其相應的值。 |
| V get(Object key) |
返回指定鍵所映射到的值,不包含則返回 null。 |
| void clear() |
將此雜湊表清空,使其不包含任何鍵。 |
| boolean containsValue(Object value) |
如果此 Hashtable 將一個或多個鍵映射到此值,則返回 true。 |
| boolean isEmpty() |
測試此雜湊表是否沒有鍵映射到值。 |
| int size() |
返回此雜湊表中的鍵的數量。 |
| void rehash() |
增加此雜湊表的容量並在內部對其進行重組,以便更有效地容納和訪問其元素。 |
Hashtable中還定義了一些其他方法,具體可以看:Java HashTable 介面。
- 棧(Stack)
棧是Vector的一個子類,它實現了一個標準的後進先出的棧。堆棧只定義了預設建構函式,用來建立一個空棧。 堆棧除了包括由Vector定義的所有方法,也定義了自己的一些方法,如下:
| 方法 |
描述 |
| boolean empty() |
測試堆棧是否為空白。 |
| Object peek( ) |
查看堆棧頂部的對象,但不從堆棧中移除它。 |
| Object pop( ) |
移除堆棧頂部的對象,並作為此函數的值返回該對。 |
| Object push(Object element) |
把項壓入堆棧頂部。 |
| int search(Object element) |
返回對象在堆棧中的位置,以 1 為基數。 |
但是Deque 介面及其實現提供了 LIFO 堆棧操作的更完整和更一致的 set,應該優先使用此 set,而非此類。
註:Java 中 Queue 是介面, Deque 是其子介面,LinkedList 和 PriorityQueue 是其實作類別,而 ArrayDeque 是 Deque 介面的實作類別。具體方法可以查看:JDK 1.6 線上中文手冊。
- 鏈表(LinkedList)
LinkedList是一個雙端鏈表,存放在結點中的資料都被看作是一個Object對象。由於任何類都是Object類的間接子類,因此,可以把任何一個對象作為鏈表結點中的資料。需要注意的是get()方法返回的類型是Object,要類型轉換回原來的類型。
構造方法:
常用方法:
| 方法 |
描述 |
| boolean add(E e) |
將指定元素添加到此列表的結尾。 |
| void add(int index, E element) |
在此列表中指定的位置插入指定的元素。 |
| E remove(int index) |
移除此列表中指定位置處的元素。 |
| E remove() |
擷取並移除此列表的頭(第一個元素)。 |
| boolean remove(Object o) |
移除首次出現的指定元素,不包含則不作更改。 |
| E set(int index, E element) |
將此列表中指定位置的元素替換為指定的元素。 |
| E get(int index) |
返回此列表中指定位置處的元素。效率低,並非隨機訪問。 |
| int indexOf(Object o) |
返回此列表中首次出現的指定元素的索引,不存在則返回-1. |
| boolean contains(Object o) |
至少包含一個指定元素,則返回 true。 |
| int size() |
返回此列表的元素數。 |
| void clear() |
從此列表中移除所有元素。 |
| Object clone() |
返回此 LinkedList 的淺表副本。(這些元素本身沒有複製。) |
| Object[] toArray() |
此方法返回一個新數組,調用者可以隨意修改。 |
LinkedList也實現了Deque介面,List介面和Queue介面,存在方法支援其用作堆棧、隊列或雙端隊列,這裡不做展開,具體方法可以查看:JDK 1.6 線上中文手冊。
https://www.cnblogs.com/mingyueanyao/p/7260301.html
Java 集合架構(常用資料結構)