Java基礎之有容乃大篇(容器篇
JAVA容器
我們學習容器的時候用最原始的分析方式
1. 有啥沒啥 ,
2. 啥是啥 ,
3. 啥能幹啥,
4. 啥和啥有啥關係
這裡再容器的介紹這一篇文章主要講的是有啥沒啥
1.List 線性表,在資料結構中,線性表有兩種實現方式,一種是陣列實現,另一種是用連結串列來實現
2.Set 一個沒有重複元素的集合,集合中元素沒有順序,可以存在空值。
3.Map 鍵值對的集合,一個鍵對應一個value,存取速度很快。
java容器List、Set的繼承關係圖:
介紹一下介面和超類:
先介紹介面:
Iterable介面,容器中的頂級介面,介面中規定了一個迭代方法,iterator。
Collection介面,繼承了Iterable的iterator方法,擴充套件了一些集合常用的方法,比如add,size,isEmpty,contains等集合
常用的方法,定義了集合最基本的方法。
List介面,繼承了Collection,在集合的基礎上特化出線性表的概念,定義了線性表常用的一些方法,get/set,add指定位置添
加,indexOf,lastIndexOf等方法。
我們都知道,線性表延伸出佇列和棧
1.佇列Queue介面,繼承了List,定義了佇列的常用方法,offer,poll,peak等方法。
Deque介面是Queue介面的子介面,代表一個雙端佇列。同時Deque不僅可以作為雙端佇列使用,而且可以被當成棧來
使用,所以可以使用出棧,入棧的方法。
2.棧這裡上圖中沒有畫到棧的圖,是因為我們圍繞ArrayList和linkedList,HashSet,HashMap等常用集合來講,簡單說下
棧,棧繼承了Vector,Vector繼承了AbstractList超類。Vector是一個底層為陣列實現的集合,平時我們不是很常用。
Set介面,繼承了Collection,擴充套件了新增元素的方法,查詢元素的方法,迭代方法和刪除方法,方法不是很多。
Set主要有三個實現類:
1.HashSet 無序
2.LinkedHashSet 有序
3.TreeSet 有序
上面就畫了兩個,linkedHashSet我不經常用,所以也就沒畫。至於TreeSet繼承NavigableSet,NavigableSet繼承Sort
edSet,SortedSet定義了有序Set的方法,在SortedSet中元素一定是有序的,目前我知道的也只有TreeSet繼承他。
NavigableSet擴充套件了 SortedSet,具有了為給定搜尋目標報告最接近匹配項的導航方法。方法 lower、floor、ceiling 和
higher 分別返回小於、小於等於、大於等於、大於給定元素的元素,如果不存在這樣的元素,則返回 null。
介紹超類:
上面的圖超類主要有AbstractCollection,AbstractList,AbstractSet,AbstrackSequentialList。按照目前我的段位來理
解,超類對超類所實現的介面進行了一些具體化的實現方式,也有一些方法是留給子類去實現的。超類有很多我們拿出一個
來講,AbstractCollection,它實現了一些方法,也定義了幾個抽象方法留給子類實現,因此它是一個抽象類。
它有兩個抽象方法
public abstract Iterator<E> iterator();
public abstract int size();
這兩個方法需要自己去是實現。他的add方法是這樣的。
public boolean add(E object) {
throw new UnsupportedOperationException();
}
如果子類是一個可以新增元素的集合,必須重寫add方法。保證集合是可以新增元素的。
剩下的一些方法AbstractCollection超類自己就實現了,另外它還重寫了toString方法,這也是我們為什麼能輸出集合中元素的原因。
java容器Map繼承關係圖:
Map介面定義了源於Map的所有基本操作。
Dictionary 類是一個抽象類,用來儲存鍵/值對,作用和Map類相似。給出鍵和值,你就可以將值儲存在Dictionary物件中。一旦該值被儲存,就可以通過它的鍵來獲取它。所以和Map一樣, Dictionary 也可以作為一個鍵/值對列表。
AbstractMap 是 Map 介面的的實現類之一,也是 HashMap, TreeMap, ConcurrentHashMap 等類的父類。AbstractMap 提供了 Map 的基本實現,使得我們以後要實現一個 Map 不用從頭開始,只需要繼承 AbstractMap, 然後按需求實現/重寫對應方法即可。
AbstarctMap 中唯一的抽象方法:
public abstract Set<Entry<K,V>> entrySet();
這裡不詳細的說明每一個類介面具體的一些方法和實現,後續會一點一點的慢慢梳理。
java容器全部繼承關係圖:
這裡關於concrrent包裡面的集合類暫時不去考慮,後續會一點一點的補充進來。
總之,我們平時經常使用的集合繼承關係已經說明清楚了,後續在我的部落格中會慢慢對每一個介面,超類,具體實現類做一個詳細的敘述。