本文關鍵詞: java集合框架 框架設計理念 容器 繼承層級結構 繼承圖 集合框架中的抽象類 主要的實現類 實現類特性 集合框架分類 集合框架併發包 併發實現類 什麼是容器? 由一個或多個確定的元素所構成的整體叫做集合。 容器用來包裝或裝載物品的貯存器 (如箱、罐、壇)或者成形或柔軟不成形的包覆材料 ...
本文關鍵詞:
java集合框架 框架設計理念 容器 繼承層級結構 繼承圖 集合框架中的抽象類 主要的實現類 實現類特性 集合框架分類 集合框架併發包 併發實現類
什麼是容器?
由一個或多個確定的元素所構成的整體叫做集合。
容器用來包裝或裝載物品的貯存器 (如箱、罐、壇)或者成形或柔軟不成形的包覆材料。
在Java中的Collection框架,有的人叫做集合有的叫做容器,不管怎麼叫基本上也離不開"把元素裝起來"這個本質.
我們的世界裡面豐富多彩,有各種各樣的事物,很多事物都會有他的容器
人的生活自然也離不開各種容器,喝水需要杯子,吃飯需要碗,煮湯需要鍋,這都是容器;
容器有各種各樣的形狀,也有各種各樣的特性;
比如茶杯有的有蓋子,有的沒有蓋子,水壺可以從壺嘴往外倒水等
java是面向對象的語言,萬事萬物皆是對象,縱然有著千姿百態的各種不同類型
所以想要在java對象中更加暢快的使用對象,自然也是需要容器的;
為什麼要有容器?
按照容器的概念,數組也是一種容器,可以用於存放一個或者多個元素;
可是,數組只能保存同一種類型的元素,而且長度是固定的;
人們自然希望可以有一種容器能夠保存各種不同的類型的元素,並且長度是不固定的;
這也是集合框架設計的初衷;
提供一種可以保存多種類型元素,並且長度不受限制的容器,來更加方便的保存對象;
所以java中的容器也就是java世界裡面承裝對象的器皿.
JAVA集合框架本質
容器根本屬性在於存/取,以及一些其他的附加的操作.
容器內部有其擺放形式:排成一行還是扔到一堆?
也有他的存取順序:先進先出還是先進後出的被壓倒最下麵?
這是抽象的描述
對應到電腦科學的世界裡面,那即是數據結構與演算法的描述
數據結構是指相互之間存在著一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成
數據結構中有線性結構,樹形結構等,形式有隊列 棧 鍵值對 等
至此,可以這麼理解編程語言中的集合框架:
集合框架目的就只是為了盛裝對象,操作對象
本質就是Java語言,針對於容器這一概念,數據結構與演算法的描述實現.
更直白的說,也就只是數據結構與演算法,java只是一個表現形式
比如LinkedList 他就是java語言對於雙向鏈表的一種描述,如果你懂雙向鏈表的原理,並且懂得java的語法,你也可以實現一個LinkedList
不過,選取哪些數據結構,使用哪些演算法,繼承層級如何安排,這是java自己的特點;
集合框架的層級結構
當然,並不是說你用Java編寫一個雙向鏈表就是寫出來集合框架了Java是面向對象的語言,面向對象的三大基礎特征,封裝繼承多態嘛想要給一門編程語言提供一個集合框架,自然不是寫幾個演算法數據結構這麼簡單的事情Java中的集合框架是自頂而下設計的如同所有的對象的祖宗都是Object一樣集合框架自然也是有祖宗的,那就是Collection 這就表示集合 ,在Java中用來存儲元素的容器
不過也還有另外一派,叫做Map ,如官方文檔中描述的那樣,Map並不算是集合,只不過是一種操作數據的結構而已但是Map也提供了類似集合似的存取元素,元素操作等功能廣義上按照我們之前說的集合/容器的概念去理解的話,自然他也可以算得上是Java集合的一份子所以一般都是把Map和Collection統稱為Java的集合體系的鑒於Java語言的特性,集合體系中這些用於刻畫家族臉譜的東西,自然都是介面,除非特別指明,所提到的類型均為介面
Collection中是一組獨立的元素而Map中則是一組成對的鍵值對元素
一組獨立的元素,Collection,中又可以按照有序的列表和無序的集,這就是List 和Set當然還有Queue,隊列其實話說回來,為何Queue直接繼承自Collection?有序和無序的並集不就已經是整體了麽隊列不也算是一種特殊的List麽,的確隊列是一種特殊的List,而且,常用的實現類LinkedList
.....implements List<E>, Deque<E>..... 並且其中 interface Deque<E> extends Queue<E>
所以說,隊列邏輯思維意義上就是列表中比較特殊的一種,只不過他的特殊性比較多
所以在實現代碼的時候把它單獨拿出來直接繼承自Collection 作為一種大的分類
也我覺得也並沒有什麼太大的違和感,個人理解,歡迎指正
現在我們已經"高屋建瓴"的把集合Collection分為了 List Set Queue這三種,再加上剛纔說到的Map
- 列表(List):List集合區分元素的順序,允許包含相同的元素,訪問集合中的元素可以根據元素的索引來訪問。
- 集(Set):Set集合不區分元素的順序,不允許包含相同的元素,訪問集合中的元素只能根據元素本身來訪問(也是集合里元素不允許重覆的原因)。
- 映射(Map):Map集合保存的”鍵”-“值”對,“鍵”不能重覆,而且一個“鍵”只能對應一個“值”,訪問時只能根據每項元素的key來訪問其value。
- 隊列(Queue) 沒什麼好理解的,就是類似隊伍的概念,詳細的以後再說
四大天王已經誕生了
Set和Map本身是無序的,在此基礎上又增加了排序的概念
所以家族裡面又多出來sortedSet 和 sortedMap
既然有了排序的概念,那麼在此之上繼續增加個可搜索的功能也沒什麼好奇怪的
也就是
NavigableSet 和 NavigableMap
不得不說,美國人英語真好
Queue隊列中又分為:
雙端隊列Deque (double ended queue)
所以主要的介面是這些:
Collection
|---List
|---Set
|---sortedSet
|---NavigableSet
|---Queue
|---Deque
|---Map
|---sortedMap
|---NavigableMap
至此,對於java集合來說,意識形態層面的設計已經完成.
集合框架的抽象類
一人心難如萬人意,集合框架設計者也明白這個道理
自然知道提供的實現類並不能滿足所有人需求,自然有人想要自己實現,
如果從頭寫來一個自然是代價巨大,考慮到這點,集合框架提供了不少的抽象類,抽象類實現了大部分通用的方法
你想要實現,只需要繼承抽象類,並且實現必要的幾個方法即可
當然,集合的設計本身也是這個思路,一舉兩得,自己寫的這麼方便的東西,沒道理不用;
抽象類大多數以Abs開頭的
AbstractCollection:
提供了Collection的主要實現
- 為了實現一個不可修改的集合,程式員只需要擴展這個類併為iterator和size 方法提供實現。(iterator方法返回的迭代器必須實現hasNext和next。)
- 為了實現一個可修改的集合,程式員必須另外重寫這個類的add方法(否則拋出一個UnsupportedOperationException),迭代器方法返回的迭代器必須另外實現它的remove方法。
Collection 下的大多數子類都繼承 AbstractCollection ,比如 List 的實現類, Set的實現類。
AbstractList
List介面的骨架實現,最大限度地減少實現由“隨機訪問”數據存儲(如數組)所支持的介面所需的工作量。
對於順序訪問數據(如鏈接列表),應該優先使用AbstractSequentialList。
AbstractSequentialList
List介面的骨架實現,以最大限度地減少實現由“順序訪問”數據存儲(如鏈接列表)支持的介面所需的工作量。
對於隨機訪問數據(如數組),應優先使用AbstractList。
AbstractSet
提供了Set介面的骨架實現,不會覆蓋AbstractCollection類中的任何實現。它只是增加了equals和hashCode的實現。
通過擴展此類來實現集合的過程與通過擴展AbstractCollection來實現集合的過程相同
不同之處在於此類的所有子類中的所有方法和構造函數都必須遵守Set介面施加的額外約束(例如,添加方法不得允許將一個對象的多個實例添加到一個集合中)。
AbstractQueue