1. 程式人生 > >java集合原始碼分析(一)---整體

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是我們經常會用到的集合類

總結

今天就是簡單的看下集合的總體框架什麼的,具體的慢慢再看