一點一點看JDK源碼(一)Collection體系概覽

一點一點看JDK源碼(一)Collection體系概覽html

liuyuhang原創,未經容許進制轉載java

 

本文舉例使用的是JDK8的API數組

 

目錄:一點一點看JDK源碼(〇)

1.綜述安全

  Collection爲集合類,是jdk中最爲經常使用的類了,實際上我並不認同這個東西叫作集合數據結構

  我更傾向於叫作容器,固然容器不止有它一種。多線程

 

  在計算機專業中,大概都會學一門叫作《數據結構》的課程吧併發

  本質上來講,數據結構,其實是設計一種容器,而容器的特性大致包括以下:框架

  • 容器中如何進行存儲
  • 容器中的數據如何獲取
  • 容器中的數據如何添加  
  • 容器中的數據如何遍歷
  • 器中的數據如何搜索
  • 容器中的其餘特性(判空,替換,排序,溢出,併發,同步,拆分,匯聚等等)

 

  在個人眼中,Collection是容器的框架集,其中包含了咱們常用的容器,ide

  

2.Collection的關注點函數

  Collection隸屬於java.util包。在本文中不討論concurrent包或其餘派生集合體系,只討論基礎

  從Collection類的原碼類註釋@see中可看到,集合體系的大概設計中重點關注的以下:

  • Set(接口)
  • List(接口)
  • Map(接口)
  • SortedSet(接口)
  • SortedMap(接口)
  • HashSet(類)
  • TreeSet(類)
  • ArrayList(類)
  • LinkedList(類)
  • Vector(類)
  • Collections(類)
  • Arrays(類)
  • AbstractCollection(抽象類)

 

  之因此只關注這些,主要有兩方面緣由:

    ①咱們的時間和技術水平有限,不可能完整的看完JDK

    ②JDK中的任何設計都是迭代產生的,咱們沒有必要看舊版本而不更新的類

 

  接下來將依照上述內容,從接口底層給它從頭扒到尾,雖說Collection中@see的是這些

  可是關注點確定不止於此。

 

3.Collection剖析

  先上Collection源碼,去掉原doc註釋,我想寫的內容直接寫在貼出來的代碼中做爲註釋了。

 

  1 public interface Collection<E> extends Iterable<E> {
  2     // Query Operations    原註釋,不明意義
  3 
  4     //定義size方法,應返回size大小,最大值爲Integer.MAX_VALUE
  5     int size();
  6 
  7     //定義isEmpty方法,用於返回是否爲空
  8     boolean isEmpty();
  9 
 10     //定義contains方法,判斷一個obj是否屬於此集合
 11     boolean contains(Object o);
 12 
 13     //定義迭代器方法,返回一個迭代器對象
 14     Iterator<E> iterator();
 15 
 16     //定義轉換爲轉換Obj數組的方法,返回一個obj數組
 17     Object[] toArray();
 18 
 19     //定義轉換爲泛型T數組的方法,返回一個指定泛型的數組
 20     <T> T[] toArray(T[] a);
 21 
 22     //定義add方法,添加一個元素e,並返回添加成功標誌
 23     boolean add(E e);
 24 
 25     //定義remove方法,移除一個元素obj,並返回移除元素成功標誌
 26     boolean remove(Object o);
 27 
 28     //定義containsAll方法,判斷是否包含集合實例對象c
 29     boolean containsAll(Collection<?> c);
 30 
 31     //定義addAll方法,添加集合實例對象c到本實例中
 32     boolean addAll(Collection<? extends E> c);
 33 
 34     //定義removeAll方法,從本實例中移除集合實力對象c
 35     boolean removeAll(Collection<?> c);
 36 
 37 
 38     /**
 39      * jdk8新增
 40      * 大意爲:
 41      * 定義removeIf方法,該方傳遞參數爲函數式,傳遞內容是一個接口類型,該接口類型
 42      * 定義爲一個filter函數,該函數用於傳遞給Objects.requireNonNull判斷,而後調用
 43      * 迭代器,將知足該定義的filter的本實例中的元素移除
 44      * @since 1.8
 45      */
 46     default boolean removeIf(Predicate<? super E> filter) {
 47         Objects.requireNonNull(filter);
 48         boolean removed = false;
 49         final Iterator<E> each = iterator();
 50         while (each.hasNext()) {
 51             if (filter.test(each.next())) {
 52                 each.remove();
 53                 removed = true;
 54             }
 55         }
 56         return removed;
 57     }
 58 
 59     //定義retainAll方法,取本例與集合實例c的交集,判斷交集元素數量是否大於0
 60     boolean retainAll(Collection<?> c);
 61 
 62     //定義clear方法,清除本例集合中的全部元素
 63     void clear();
 64 
 65     // Comparison and hashing    原註釋,不明意義
 66 
 67     //不解釋
 68     boolean equals(Object o);
 69 
 70     //定義hashCode方法,獲取hashCode標記的方法
 71     int hashCode();
 72 
 73     /**
 74      *jdk8新增
 75      *大意爲:
 76      *將迭代器拆分,重寫自Iterable接口,從已知元素數量的本例中返回拆分後的迭代器
 77      *此方法返回的爲本類自己
 78      *子類可能重寫迭代器拆分,將一個集合的迭代拆分爲多個集合的迭代交由多個線程
 79      * @since 1.8
 80      */
 81     @Override//重寫父類
 82     default Spliterator<E> spliterator() {
 83         return Spliterators.spliterator(this, 0);
 84     }
 85 
 86     /**
 87      * jdk8新增
 88      * 大意爲:
 89      * 將默認的迭代器拆分後的結果,聚合爲流,該流並不是io中的流,
 90      * 是一種相似於數據排序操做流
 91      * @since 1.8
 92      */
 93     default Stream<E> stream() {
 94         return StreamSupport.stream(spliterator(), false);
 95     }
 96 
 97     /**
 98      * jdk8新增
 99      * 同上,可是具體其餘的實現中,由於可並行,因此多是線程不安全的
100      * 
101      * @since 1.8
102      */
103     default Stream<E> parallelStream() {
104         return StreamSupport.stream(spliterator(), true);
105     }    

  以上代碼對Collection接口中的方法進行了簡單的解釋,同時對java8新增的一些方法也進行了簡單的解釋。

  由於定義的都是接口,實際實現的方法很是的少,

  而應java8多線程的特性提供的一些default方法也有子類去實現。

  在堆Collection接口中的源碼進行了解的同時,不要忘記此接口繼承了Iterable接口。

  所以Iterable接口也一定要看一下的,內容比較少,可是經過源碼的剖析,發現了集合類的共性:

 

  集合做爲容器,其體系中的全部集合都包括了:

  大小(size),判空(isEmpty),添加元素(add),刪除元素(remove),是否包含(contains)

  轉換數組(toArray),清空(clear),遍歷與迭代(forEach(父接口中),iterator)

  是否相同(equals),哈希(hashCode),求交集(retainAll)

  除此以外,提供了java8的分離接口,聚合接口,爲了大容量集合的多線程操做

 

  注意,Collection接口並無重寫父接口的forEach方法,而iterator方法雖然有出現,可是沒有@Override註解

 

  一樣貼一下代碼,一樣的去掉原doc註釋,我想寫的內容直接寫在貼出來的代碼中做爲註釋了。

 1 public interface Iterable<T> {
 2 
 3     //定義iterator方法,返回迭代器
 4     Iterator<T> iterator();
 5 
 6     /**
 7      * jdk8新增
 8      * 大意爲:
 9      * 根據action調用Objects.requireNonNull進行過濾
10      * 過濾結果調用for循環取出,
11      * @since 1.8
12      */
13     default void forEach(Consumer<? super T> action) {
14         Objects.requireNonNull(action);
15         for (T t : this) {
16             action.accept(t);
17         }
18     }
19 
20     /**
21      * jdk8新增
22      * 大意爲:
23      * 分離迭代器,將未知大小的迭代器進行拆分,返回拆分的迭代器自己
24      * 
25      * @since 1.8
26      */
27     default Spliterator<T> spliterator() {
28         return Spliterators.spliteratorUnknownSize(iterator(), 0);
29     }
30 }

 

有時候咱們並不怎麼關心父接口的問題,可是實際上這個問題有點重要的仍是,上兩張圖解釋一下:

 

 不要覺得以上兩種接口定義實現類的方式沒區別,實際上有區別,區別大了,可實現的方法列表有差別

該問題具體解析,將在後續更新中詳細寫代碼測試。

 

Collection接口內容較少,多數都只是定義了必要內容,具體實現較少。難點都在java8中的default方法上了

等之後弄完全明白了可能再寫通俗解釋和經常使用方式。

 

明天更對於List接口的剖析和ArrayList的簡要剖析!

 

以上!

相關文章
相關標籤/搜索