【翻譯】集合框架概述

特立獨行的豬手發表於2017-04-10

原文地址:Collections Framework Overview

介紹

Java平臺中有一個集合框架collections framework。集合表示一組物件集的物件(例如經典的Vector類)。集合框架用來表示和操作集合的統一架構,可以拋開實現細節來操作集合。集合框架主要的有點如下所示:

  • 減少程式設計工作量 :提供了資料結構和演算法,無需我們自己編寫實現。
  • 提高效能:提供了高效能的資料結構與演算法的實現,因為各個實現之間是可以相互轉換的,所以可以通過轉換實現來調整程式。
  • 提供不相關API之間互通性:建立一種通用的語言來回傳遞集合。
  • 減少學習API成本:只需要關注幾個指定的API
  • 減少設計與實現API的成本:不需要使用者實現指定的API
  • 重用性強: 為集合和演算法提供了標準的介面。

集合框架包括:

  • 集合介面。提供了不同型別的集合介面,例如sets, lists,maps。這些介面作為集合框架的基礎。
  • 通用實現類。 提供了集合介面的主要通用實現。
  • 傳統實現類。 改進早期版本的集合類VectorHashtable來實現集合介面。
  • 專用實現類。 針對特殊場景的實現,這些實現顯示出非標準的效能特徵、使用限定或行為。
  • 快速實現類。 集合介面的高效能的“微實現”。
  • 抽象實現類。 集合介面的部分實現抽象出來方便與其他自定義的實現複用。
  • 演算法。 集合實現某種功能的靜態方法,如:list排序。
  • 基礎服務。 提供為集合介面必要支援的介面。
  • 陣列工具。 提供一些基礎陣列和引用陣列的使用方法。嚴格的說,不算是集合框架的一部分。這次會將這些方法與集合框架同時加入Java平臺,並同時依賴一些相同的基礎架構。

集合介面

集合介面被分為2組,java.util.Collection是最為基礎的介面,有如下子類:

  • java.util.Set
  • java.util.SortedSet
  • java.util.NavigableSet
  • java.util.Queue
  • java.util.concurrent.BlockingQueue
  • java.util.concurrent.TransferQueue
  • java.util.Deque
  • java.util.concurrent.BlockingDeque

另外一些集合介面基於java.util.Map類而且並非真正意義上的集合。但是這些介面包含集合檢視的操作,可以將其轉換為集合。以下是繼承與Map的子類:

  • java.util.SortedMap
  • java.util.NavigableMap
  • java.util.concurrent.ConcurrentMap
  • java.util.concurrent.ConcurrentNavigableMap

在集合介面中大多數可重寫的方法會被標記成optional。實現類允許不執行這些方法,如果嘗試執行會丟擲異常(UnsupportedOperationException)。每個實現類的文件必須說明支援哪些可選操作。以下介紹幾種說明來幫助理解此規範:

  • 集合中不支援可修改的操作(例如addremoveclear)被稱為不可修改的(unmodifiable)。集合不是unmodifiable是可以被修改的。
  • 集合要確保集合物件不會改變的集合被稱為不可變的(immutable)。集合不是immutable是可以改變的。
  • lists保證其元素個數保持不變,即使元素被改變也被稱為固定大小(fixed-size)。不是fixed-sizelists大小可以改變。
  • 支援快速(通常是固定時間)索引元素訪問的lists被為隨機訪問list。被隨機訪問的標記的lists表明其可以被隨機訪問。這允許一些通用的演算法來改變其的行為,適用於隨機或順序訪問的lists,來提供良好的效能。

某些實現限定只能儲存特定的元素(或者Map中的一種,key和values)。可能元素的限制可能有:

  • 特定型別
  • 非null型別
  • 遵循一些特定的述語的

嘗試新增一個不符合某實現類限制的元素, 會導致執行時異常, 通常是 ClassCastException, IllegalArgumentException或者 NullPointerException。 嘗試刪除或者查詢一個不符合某實現類限制的元素, 也會導致拋異常。但是也有一些有限制的集合允許這樣做.

集合實現

典型的實現類的名稱形式通常來源於其介面<Implementation-style><Interface>。以下表格是集合常用的實現類的概覽:

【翻譯】集合框架概述

這些通用實現類支援集合介面中所有的optional操作,對於所包含的元素也沒有限制。他們是不同步的,但是如果集合類包含靜態元素被稱為同步包裝器(synchronization wrappers)將會被用來給這些不同步的實現類做同步擴充。所有的新的實現類都有快速失敗迭代器,用來發現無效的同步修改並快速徹底捨棄(而不是不規律的行為)。

AbstractCollection, AbstractSet, AbstractList, AbstractSequentialListAbstractMap這些抽象類提供核心集合介面的基礎實現,減少了他們現實的成本。這些類API文件明確描述了每一個方法是如何實現的,以便實現的人知道哪些方法必須被重寫,API文件也給出特定實現中每種基本操作的效能表現。

併發集合

應用在多執行緒環境下使用集合要加以小心。通常,這也被成為併發程式設計。Java平臺提供了併發程式設計的擴充,詳細見Java Concurrency Utilities

集合如此頻繁被使用,是因為在APIs中一些友好併發的介面和集合的實現。這些類超出了之前討論的併發包裝器,並頻繁應用於併發程式設計中。

可用的支援併發的介面有:

  • BlockingQueue
  • TransferQueue
  • BlockingDeque
  • ConcurrentMap
  • ConcurrentNavigableMap

以下是支援併發的實現類,可以在其文件中檢視這些實現的併發使用方法:

  • LinkedBlockingQueue
  • ArrayBlockingQueue
  • PriorityBlockingQueue
  • DelayQueue
  • SynchronousQueue
  • LinkedBlockingDeque
  • LinkedTransferQueue
  • CopyOnWriteArrayList
  • CopyOnWriteArraySet
  • ConcurrentSkipListSet
  • ConcurrentHashMap
  • ConcurrentSkipListMap

設計目標

主要的設計目標創造出一套輕量級、重概念的API。至關重要的是新的功要與現有的Java程式看起來並無太多的差異。必須要擴充當前的服務,而不是設法替換它。同時,新API需要有足夠的能力來保證提供之前描述的優點。

為了使得核心介面的數量少,介面並沒有試圖去捕捉一些細微的差別,形如:集合物件的可變性、集合元素的可修改性、集合長度的可變性。相反,在核心介面中這些特性明確是可選的,允許在實現中丟擲UnsupportedOperationException異常來表明其不支援某個指定可選方法。集合實現類必須在文件中表明每個實現類支援哪些操作。

為了保持每個核心介面中的方法足夠少,一個介面包含一個方法必須符合如下條件之一:

  • 這是一個重要且基礎的操作:就被合理定義而言,這應該是一個基本操作。
  • 必須有一個令人信服的效能原因才能使得一個重要的實現類去重寫它。

至關重要的是集合所有合理的表示需要有好的相互操作性。這包括陣列,除非改變語言,否則不可能直接通過陣列來實現集合介面。因此,集合框架包含了可以將集合轉換陣列的方法,以及arraysmaps被視為集合。

相關文章