java集合原始碼分析(一)---整體
吐槽
這個月要把java的集合好好重新看下了,把上個月沒看的補上,突然發現自己寫了這麼久的安卓,集合那塊都忘的差不多了,自己看了下自己當時寫的集合的部落格,寫的真心爛唉。
自己當時學的時候的部落格
主要的目的是搞清楚集合底部的實現原理,和幾個的具體的區別
學習的方式:看大佬的部落格 + 自己看原始碼程式碼 + 畫流程圖
大佬部落格連結:大佬部落格專欄
集合的整體框架結構
在這張圖裡面,我們發現裡面就三大類東西
- 集合介面:6個介面(短虛線表示),表示不同的集合型別
- 抽象類:5個抽象類(長虛線表示),對介面的部分實現
- 實現類:8個實現類(實線表示),對介面的具體試現
在圖中我們也發現,集合也分為兩個派系,一個Collection和Map
Collection介面
Collection介面是集合類的根介面,它沒有具體的實現,但是讓其兩個兒子Set和List,其中Set中不能包含重複的元素。List是一個有序的集合,可以包含重複的元素,提供了按索引訪問的方式。
我們去官方文件看下:
好像就是這個就是個介面,裡面有一大堆的方法,而且我們發現裡面這個介面,進去看下這個介面的原始碼,發現裡面的方法都是新增元素,刪除元素,返回集合中的個數,以及清空集合,但是裡面也有一個特殊的方法
Iterator<E> iterator();
返回在這個集合上面的迭代器
public interface Collection< E> extends Iterable<E> {
..........
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
................
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
然後我們發現這個類居然也繼承另一個類Iterable,我們也進去看下這個類
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
這個類也是個介面,主要的方法也是那個方法 Iterator iterator();返回這個集合上面的迭代器
所以,邏輯很清晰,父介面 Iterable裡面,就一個iterator 方法,返回一個terator 迭代器,然後子介面Collection,還是有這個返回迭代器的方法,然後加了許多其他的方法
我們接著去看下Iterator具體實現
Iterator介面
我們還是先去看下官方的文件
好像看了下,就是簡單的一個介面,它有三個方法,具體的實現還需要看它的具體實現類
Collection派系
其中,ArrayList,HashSet,LinkedList,TreeSet是我們經常會有用到的已實現的集合類。
Map派系
還是先看下官方的文件
Map實現類用於儲存具有對映關係的資料。Map儲存的每項資料都是key-value對,也就是由key和value兩個值組成。Map裡的key是不可重複的,key使用者標識集合裡的每項資料。
HashMap,TreeMap是我們經常會用到的集合類
總結
今天就是簡單的看下集合的總體框架什麼的,具體的慢慢再看