一點一點看JDK源碼(一)Collection體系概覽html
liuyuhang原創,未經容許進制轉載java
本文舉例使用的是JDK8的API數組
1.綜述安全
Collection爲集合類,是jdk中最爲經常使用的類了,實際上我並不認同這個東西叫作集合數據結構
我更傾向於叫作容器,固然容器不止有它一種。多線程
在計算機專業中,大概都會學一門叫作《數據結構》的課程吧併發
本質上來講,數據結構,其實是設計一種容器,而容器的特性大致包括以下:框架
在個人眼中,Collection是容器的框架集,其中包含了咱們常用的容器,ide
2.Collection的關注點函數
Collection隸屬於java.util包。在本文中不討論concurrent包或其餘派生集合體系,只討論基礎
從Collection類的原碼類註釋@see中可看到,集合體系的大概設計中重點關注的以下:
之因此只關注這些,主要有兩方面緣由:
①咱們的時間和技術水平有限,不可能完整的看完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的簡要剖析!
以上!