四大名捕—java集合類框架概述 – JAVA編程語言程序開發技術文章

Java裡面最重要,最常用也就是集合一部分瞭。能夠用好集合和理解好集合對於做Java程序的開發擁有無比的好處。本文詳細解釋瞭關於Java中的集合是如何實現的,以及他們的實現原理。
一      集合框架
1.     集合框架概述
1.1.1         容器簡介
到目前為止,我們已經學習瞭如何創建多個不同的對象,定義瞭這些對象以後,我們就可以利用它們來做一些有意義的事情。
   舉例來說,假設要存儲許多雇員,不同的雇員的區別僅在於雇員的身份證號。我們可以通過身份證號來順序存儲每個雇員,但是在內存中實現呢?是不是要準備足夠的內存來存儲1000個雇員,然後再將這些雇員逐一插入?如果已經插入瞭500條記錄,這時需要插入一個身份證號較低的新雇員,該怎麼辦呢?是在內存中將500條記錄全部下移後,再從開頭插入新的記錄? 還是創建一個映射來記住每個對象的位置?當決定如何存儲對象的集合時,必須考慮如下問題。
   對於對象集合,必須執行的操作主要以下三種:
u       添加新的對象
u       刪除對象
u       查找對象
我們必須確定如何將新的對象添加到集合中。可以將對象添加到集合的末尾、開頭或者中間的某個邏輯位置。
從集合中刪除一個對象後,對象集合中現有對象會有什麼影響呢?可能必須將內存移來移去,或者就在現有對象所駐留的內存位置下一個“洞”。
   在內存中建立對象集合後,必須確定如何定位特定對象。可建立一種機制,利用該機制可根據某些搜索條件(例如身份證號)直接定位到目標對象;否則,便需要遍歷集合中的每個對象,直到找到要查找的對象為止。
   前面大傢已經學習過瞭數組。數組的作用是可以存取一組數據。但是它卻存在一些缺點,使得無法使用它來比較方便快捷的完成上述應用場景的要求。
1.        首先,在很多數情況下面,我們需要能夠存儲一組數據的容器,這一點雖然數組可以實現,但是如果我們需要存儲的數據的個數多少並不確定。比如說:我們需要在容器裡面存儲某個應用系統的當前的所有的在線用戶信息,而當前的在線用戶信息是時刻都可能在變化的。 也就是說,我們需要一種存儲數據的容器,它能夠自動的改變這個容器的所能存放的數據數量的大小。這一點上,如果使用數組來存儲的話,就顯得十分的笨拙。
2.        我們再假設這樣一種場景:假定一個購物網站,經過一段時間的運行,我們已經存儲瞭一系列的購物清單瞭,購物清單中有商品信息。如果我們想要知道這段時間裡面有多少種商品被銷售出去瞭。那麼我們就需要一個容器能夠自動的過濾掉購物清單中的關於商品的重復信息。如果使用數組,這也是很難實現的。
3.        最後再想想,我們經常會遇到這種情況,我知道某個人的帳號名稱,希望能夠進一步瞭解這個人的其他的一些信息。也就是說,我們在一個地方存放一些用戶信息,我們希望能夠通過用戶的帳號來查找到對應的該用戶的其他的一些信息。再舉個查字典例子:假設我們希望使用一個容器來存放單詞以及對於這個單詞的解釋,而當我們想要查找某個單詞的意思的時候,能夠根據提供的單詞在這個容器中找到對應的單詞的解釋。如果使用數組來實現的話,就更加的困難瞭。
為解決這些問題,Java裡面就設計瞭容器集合,不同的容器集合以不同的格式保存對象。
數學背景
在常見用法中,集合(collection)和數學上直觀的集(set)的概念是相同的。集是一個唯一項組,也就是說組中沒有重復項。實際上,“集合框架”包含瞭一個Set 接口和許多具體的Set 類。但正式的集概念卻比 Java 技術提前瞭一個世紀,那時英國數學傢 George Boole 按邏輯正式的定義瞭集的概念。大部分人在小學時通過我們熟悉的維恩圖引入的“集的交”和“集的並”學到過一些集的理論。  
集的基本屬性如下:
u       集內隻包含每項的一個實例
u       集可以是有限的,也可以是無限的
u       可以定義抽象概念
集不僅是邏輯學、數學和計算機科學的基礎,對於商業和系統的日常應用來說,它也很實用。“連接池”這一概念就是數據庫服務器的一個開放連接集。Web 服務器必須管理客戶機和連接集。文件描述符提供瞭操作系統中另一個集的示例。
映射是一種特別的集。它是一種對(pair)集,每個對表示一個元素到另一元素的單向映射。一些映射示例有:
u       IP 地址到域名(DNS)的映射
u       關鍵字到數據庫記錄的映射
u       字典(詞到含義的映射)
u       2 進制到 10 進制轉換的映射
就像集一樣,映射背後的思想比 Java 編程語言早的多,甚至比計算機科學還早。而Java中的Map 就是映射的一種表現形式。
1.1.2        容器的分類
既然您已經具備瞭一些集的理論,您應該能夠更輕松的理解“集合框架”。“集合框架”由一組用來操作對象的接口組成。不同接口描述不同類型的組。在很大程度上,一旦您理解瞭接口,您就理解瞭框架。雖然您總要創建接口特定的實現,但訪問實際集合的方法應該限制在接口方法的使用上;因此,允許您更改基本的數據結構而不必改變其它代碼。框架接口層次結構如下圖所示。
 
Java容器類類庫的用途是“保存對象”,並將其劃分為兩個不同的概念:
1)  Collection 。 一組對立的元素,通常這些元素都服從某種規則。List必須保持元素特定的順序,而Set 不能有重復元素。
2)  Map 。 一組 成對的“鍵值對”對象。初看起來這似乎應該是一個Collection ,其元素是成對的對象,但是這樣的設計實現起來太笨拙瞭,於是我們將Map明確的提取出來形成一個獨立的概念。另一方面,如果使用Collection 表示Map的部分內容,會便於查看此部分內容。因此Map一樣容易擴展成多維Map ,無需增加新的概念,隻要讓Map中的鍵值對的每個“值”也是一個Map即可。
Collection和Map的區別在於容器中每個位置保存的元素個數。Collection 每個位置隻能保存一個元素(對象)。此類容器包括:List ,它以特定的順序保存一組元素;Set 則是元素不能重復。
Map保存的是“鍵值對”,就像一個小型數據庫。我們可以通過“鍵”找到該鍵對應的“值”。
u     Collection – 對象之間沒有指定的順序,允許重復元素。
u     Set – 對象之間沒有指定的順序,不允許重復元素
u     List– 對象之間有指定的順序,允許重復元素,並引入位置下標。
u     Map – 接口用於保存關鍵字(Key)和數值(Value)的集合,集合中的每個對象加入時都提供數值和關鍵字。Map 接口既不繼承 Set 也不繼承 Collection。
List、Set、Map共同的實現基礎是Object數組
除瞭四個歷史集合類外,Java 2 框架還引入瞭六個集合實現,如下表所示。
接口
實現
歷史集合類
Set
HashSet
 
 
TreeSet
 
List
ArrayList
Vector
 
LinkedList
Stack
Map
HashMap
Hashtable
 
TreeMap
Properties
 
這裡沒有 Collection 接口的實現,接下來我們再來看一下下面的這張關於集合框架的大圖:
   這張圖看起來有點嚇人,熟悉之後就會發現其實隻有三種容器:Map,List和Set ,它們各自有兩個三個實現版本。常用的容器用黑色粗線框表示。
點線方框代表“接口”,虛線方框代表抽象類,而實線方框代表普通類(即具體類,而非抽象類)。虛線箭頭指出一個特定的類實現瞭一個接口(在抽象類的情況下,則是“部分”實現瞭那個接口)。實線箭頭指出一個類可生成箭頭指向的那個類的對象。例如任何集合( Collection )都能產生一個迭代器( Iterator ),而一個List 除瞭能生成一個ListIterator (列表迭代器)外,還能生成一個普通迭代器,因為List 正是從集合繼承來的.
作者:pplsunny

You May Also Like