Java集合框架綜述

ImportNew發表於2015-09-11

最近被陸陸續續問了幾遍HashMap的實現,回答的不好,打算複習複習JDK中的集合框架,並嘗試分析其原始碼,這麼做一方面是這些類非常實用,掌握其實現能更好的優化我們的程式;另一方面是學習借鑑JDK是如何實現了這麼一套優雅高效的類庫,提升程式設計能力。

在介紹具體適合類之前,本篇文章對Java中的集合框架做一個大致描述,從一個高的角度俯視這個框架,瞭解了這個框架的一些理念與約定,會大大幫助後面分析某個具體類,讓我們開始吧。

集合框架(collections framework)

首先要明確,集合代表了一組物件(和陣列一樣,但陣列長度不能變,而集合能)。Java中的集合框架定義了一套規範,用來表示、操作集合,使具體操作與實現細節解耦。

其實說白了,可以把一個集合看成一個微型資料庫,操作不外乎“增刪改查”四種操作,我們在學習使用一個具體的集合類時,需要把這四個操作的時空複雜度弄清楚了,基本上就可以說掌握這個類了。

設計理念

主要理念用一句話概括就是:提供一套“小而美”的API。API需要對程式設計師友好,增加新功能時能讓程式設計師們快速上手。
為了保證核心介面足夠小,最頂層的介面(也就是Collection與Map介面)並不會區分該集合是否可變(mutability),是否可更改(modifiability),是否可改變大小(resizability)這些細微的差別。相反,一些操作是可選的,在實現時丟擲UnsupportedOperationException即可表示集合不支援該操作。集合的實現者必須在文件中宣告那些操作是不支援的。

為了保證最頂層的核心介面足夠小,它們只能包含下面情況下的方法:

  1. 基本操作,像之前說的“增刪改查”
  2. There is a compelling performance reason why an important implementation would want to override it.

此外,所有的集合類都必須能提供友好的互動操作,這包括沒有繼承Collection類的陣列物件。因此,框架提供一套方法,讓集合類與陣列可以相互轉化,並且可以把Map看作成集合。

兩大基類Collection與Map

在集合框架的類繼承體系中,最頂層有兩個介面:

  • Collection表示一組純資料
  • Map表示一組key-value對

一般繼承自CollectionMap的集合類,會提供兩個“標準”的建構函式:

  • 沒有引數的建構函式,建立一個空的集合類
  • 有一個型別與基類(CollectionMap)相同的建構函式,建立一個與給定引數具有相同元素的新集合類

因為介面中不能包含建構函式,所以上面這兩個建構函式的約定並不是強制性的,但是在目前的集合框架中,所有繼承自CollectionMap的子類都遵循這一約定。

Collection

Java集合框架綜述java-collection-hierarchy

如上圖所示,Collection類主要有三個介面:

  • Set表示不允許有重複元素的集合(A collection that contains no duplicate elements)
  • List表示允許有重複元素的集合(An ordered collection (also known as a sequence))
  • Queue JDK1.5新增,與上面兩個集合類主要是的區分在於Queue主要用於儲存資料,而不是處理資料。(A collection designed for holding elements prior to processing.)

Map

Java集合框架綜述

MapClassHierarchy

Map並不是一個真正意義上的集合(are not true collections),但是這個介面提供了三種“集合視角”(collection views ),使得可以像操作集合一樣操作它們,具體如下:

  • 把map的內容看作key的集合(map’s contents to be viewed as a set of keys)
  • 把map的內容看作value的集合(map’s contents to be viewed as a collection of values)
  • 把map的內容看作key-value對映的集合(map’s contents to be viewed as a set of key-value mappings)

總結

今天先開個頭,後面會陸陸續續來一系列乾貨,Stay Tuned。

需要說明一點,今後所有原始碼分析都將基於Oracle JDK 1.7.0_71,請知悉。

$ java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

相關文章