看看 AbstractCollection 吧

今天饒有興趣的打開了 java 文檔,點開上面的 TREE,能夠看到各個類的依賴關係,可是這裏仍是看不到和接口的關係,由於類能夠實現多個接口的,因此在這樣的文檔中就很差展示了吧。html

由於日常使用中,集合類用的比較多,因此想寫一下結合類的內容,下面能夠看到集合類的關係,這樣看上去仍是蠻清楚的吧,咱們就先來看看第一個 AbstractCollectionjava

能夠看到繼承 AbstractCollection 類的關係,看這個比看那些圖清晰了一些,這裏沒有展示出來的是實現的兩個接口 api

Iterable<E>Collection<E>oracle

在 Collection 中是裏面定義餓了集合該實現的方法,這裏面還涉及到泛型的概念,直接繼承的有AbstractListAbstractQueueAbstractSetArrayDequeConcurrentLinkedDeque app

讓咱們先來看看 Collection<E> 接口裏面定義了哪些要實現的通用方法吧,其實能夠看到是 interface Collection<E> extends Iterable<E> ,如下是 java 8 中 Iterable 的方法 ,在以前的版本應該是沒有 default 定義的接口實現的。ui

在 Collection<E> 中定義集合的一些方法,java 1.8 (能夠看到 default 的 stream 方法),像集合的 hashCode, add ,equals 都是很值得一說的,在effective java 講的比較多,我就等着出第三版的時候買一本吧,可能啊亞馬遜上英文版的好貴呀。this

而後看看今天的標題 AbstractCollection 抽象類,看看裏面實現了哪些方法3d

咱們看看contains 方法,這裏用了迭代器返回的進行遍歷,其實 iterator()方法是實現類本身實現的,這裏會對傳值是否爲 null 的判斷,由於下面會使用 equals 方法。code

咱們看到的報 UnsupportedOperationException 就是這麼來的htm

這個 remove 方法和contains 方法一模一樣

containsAll 方法遍歷集合裏面的元素,可是contains 會判斷 參數是否爲空,可是這裏又不會,那麼這麼寫list.containsAll(null); 不會報錯了。

addAll 這裏會記錄有沒有修改 modified 字段標識,這裏就看怎麼實現的,相同的 item 到底算不算 add 成功,這裏就能夠玩點花樣了。

removeAll 這裏又對參數 c 作了判斷,真是奇怪,這裏有什麼講究嗎?

最後看看 toString 方法吧,由於 String 是會變的,因此用了 StringBuilder,只是這一行            sb.append(e == this ? "(this Collection)" : e); 這個this 是表明集合本身嗎?

這裏還看不太明白的是 toArray 方法,爲何要這麼寫呢,暫時還想不明白,再看看吧

相關文章
相關標籤/搜索