Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java APIs與框架

Java 類引用

Java 有用資源

Java集合框架



在 Java 2 之前,Java 提供了臨時類,例如Dictionary、Vector、StackProperties 來儲存和操作物件組。雖然這些類非常有用,但它們缺乏一個核心統一的主題。因此,使用 Vector 的方式與使用 Properties 的方式不同。

為什麼需要集合框架?

集合框架的設計是為了滿足幾個目標,例如:

  • 該框架必須具有高效能。基本集合(動態陣列、連結串列、樹和雜湊表)的實現必須高效。

  • 該框架必須允許不同型別的集合以類似的方式工作,並具有高度的互操作性。

  • 該框架必須能夠輕鬆擴充套件和/或適配集合。

為此,整個集合框架都是圍繞一組標準介面設計的。提供了幾個這些介面的標準實現,例如LinkedList、HashSetTreeSet,您可以按原樣使用它們,也可以根據需要實現您自己的集合。

Java 集合框架

集合框架是表示和操作集合的統一架構。所有集合框架都包含以下內容:

  • 介面 − 這些是表示集合的抽象資料型別。介面允許獨立於其表示細節來操作集合。在面向物件語言中,介面通常形成層次結構。

  • 實現,即 − 這些是集合介面的具體實現。從本質上講,它們是可重用的資料結構。

  • 演算法 − 這些是在實現集合介面的物件上執行有用計算(例如搜尋和排序)的方法。據說演算法是多型的:即,相同的方法可以用於許多不同實現的適當集合介面。

除了集合之外,框架還定義了幾個對映介面和類。對映儲存鍵/值對。雖然對映並非集合(按術語的正確用法),但它們與集合完全整合。

集合框架的層次結構

集合框架的所有類和介面都可以在java.util 包中找到。下圖顯示了 Java 中集合框架的層次結構。(此處應插入圖表)

Hierarchy of Collection Framework

Java 集合介面

集合框架定義了幾個介面。本節概述每個介面:

序號 介面與描述
1 Collection 介面

這使您可以使用物件組;它是集合層次結構的頂層。

2 List 介面

這擴充套件了Collection,List 的例項儲存元素的有序集合。

3 Set 介面

這擴充套件了 Collection 來處理集合,集合必須包含唯一元素。

4 SortedSet 介面

這擴充套件了 Set 來處理排序集合。

5 Map 介面

這將唯一鍵對映到值。

6 Map.Entry 介面

這描述了對映中的元素(鍵/值對)。這是 Map 的內部類。

7 SortedMap 介面

這擴充套件了 Map,以便鍵按升序維護。

8 Enumeration 介面

這個遺留介面定義了您可以列舉(一次獲取一個)物件集合中的元素的方法。這個遺留介面已被 Iterator 取代。

Java 集合類

Java 提供了一組實現 Collection 介面的標準集合類。一些類提供了完整的實現,可以按原樣使用,而另一些是抽象類,提供骨架實現,用作建立具體集合的起點。

標準集合類總結在下表中:

序號 類與描述
1

AbstractCollection 類

實現了大部分 Collection 介面。

2

AbstractList 類

擴充套件 AbstractCollection 並實現 List 介面的大部分功能。

3

AbstractSequentialList

擴充套件 AbstractList,供使用順序訪問(而非隨機訪問)元素的集合使用。

4 LinkedList

透過擴充套件 AbstractSequentialList 實現連結串列。

5 ArrayList

透過擴充套件 AbstractList 實現動態陣列。

6

AbstractSet

擴充套件 AbstractCollection 並實現 Set 介面的大部分功能。

7 HashSet

擴充套件 AbstractSet,用於雜湊表。

8 LinkedHashSet

擴充套件 HashSet,允許按插入順序迭代。

9 TreeSet

實現儲存在樹中的集合。擴充套件 AbstractSet。

10

AbstractMap

實現 Map 介面的大部分功能。

11 HashMap

擴充套件 AbstractMap,使用雜湊表。

12 TreeMap

擴充套件 AbstractMap,使用樹。

13 WeakHashMap

擴充套件 AbstractMap,使用具有弱鍵的雜湊表。

14 LinkedHashMap

擴充套件 HashMap,允許按插入順序迭代。

15 IdentityHashMap

擴充套件 AbstractMap,在比較文件時使用引用相等性。

AbstractCollection、AbstractSet、AbstractList、AbstractSequentialListAbstractMap 類提供了核心集合介面的骨架實現,以最大限度地減少實現它們所需的努力。

前面章節討論了 java.util 定義的以下遺留類:

序號 類與描述
1 Vector

實現動態陣列。它類似於 ArrayList,但有一些區別。

2 Stack

Stack 是 Vector 的子類,實現標準的後進先出 (LIFO) 棧。

3 Dictionary

Dictionary 是一個抽象類,表示鍵值儲存庫,其功能與 Map 非常相似。

4 Hashtable

Hashtable 是最初的 java.util 的一部分,是 Dictionary 的具體實現。

5 Properties

Properties 是 Hashtable 的子類。它用於維護值列表,其中鍵是字串,值也是字串。

6 PriorityQueue

PriorityQueue 類是基於優先順序堆的無界優先順序佇列。依賴自然排序的優先順序佇列也不允許插入不可比較的物件。

7 BitSet

BitSet 類建立一個特殊型別的陣列,用於儲存位值。此陣列可以根據需要增加大小。

8 ArrayDeque

ArrayDeque 類提供可調整大小的陣列並實現 Deque 介面。陣列雙端佇列沒有容量限制,因此它們會根據需要增長以支援使用。

9 EnumMap

EnumMap 類是一個專門的 Map 實現,用於列舉鍵。列舉對映中的所有鍵都必須來自建立對映時顯式或隱式指定的單個列舉型別。

10 Queue

Queue 介面在 java.util 包中提供,它實現 Collection 介面。Queue 實現 FIFO(先進先出)。這意味著先輸入的元素是先刪除的元素。

11 Deque

EnumMap 類是一個專門的 Map 實現,用於列舉鍵。列舉對映中的所有鍵都必須來自建立對映時顯式或隱式指定的單個列舉型別。

集合演算法

集合框架定義了幾種可應用於集合和對映的演算法。這些演算法在 Collections 類中定義為靜態方法。

一些方法可能會丟擲 **ClassCastException**(當嘗試比較不相容的型別時發生)或 **UnsupportedOperationException**(當嘗試修改不可修改的集合時發生)。

Collections 定義三個靜態變數:EMPTY_SET、EMPTY_LIST 和 EMPTY_MAP。所有這些都是不可變的。

序號 演算法和描述
1 集合演算法

這是一個所有演算法實現的列表。

如何使用迭代器?

通常,您需要遍歷集合中的元素。例如,您可能需要顯示每個元素。

最簡單的方法是使用迭代器,它是一個實現 Iterator 或 ListIterator 介面的物件。

迭代器使您可以遍歷集合,獲取或刪除元素。ListIterator 擴充套件 Iterator 以允許雙向遍歷列表和修改元素。

序號 迭代器方法和描述
1 使用 Java 迭代器

這是一個 Iterator 和 ListIterator 介面提供的所有方法的列表,並附帶示例。

如何使用比較器?

TreeSet 和 TreeMap 都按排序順序儲存元素。但是,正是比較器定義了“排序順序”的確切含義。

此介面允許我們以多種不同的方式對給定的集合進行排序。此外,此介面還可用於對任何類的任何例項進行排序(即使是我們無法修改的類)。

序號 迭代器方法和描述
1 使用 Java 比較器

這是一個 Comparator 介面提供的所有方法的列表,並附帶示例。

如何使用可比較物件?

TreeSet 和 TreeMap 都按排序順序儲存元素。我們可以使用 Comparable 介面來精確定義“排序順序”的含義。

此介面允許我們以多種不同的方式對給定的集合進行排序。此外,此介面還可用於對任何類的任何例項進行排序(即使是我們無法修改的類)。

序號 迭代器方法和描述
1 使用 Java Comparable

這是一個 Comparable 介面提供的所有方法的列表,並附帶示例。

總結

Java 集合框架使程式設計師可以訪問預打包的資料結構以及用於操作它們的方法。

集合是一個可以儲存對其他物件的引用的物件。集合介面宣告可以對每種型別的集合執行的操作。

集合框架的類和介面位於 java.util 包中。

廣告