Java 基礎(三)集合原始碼解析 Collection

diamond_lin發表於2017-09-25

前面我們講到了集合的定義以及集合的 Iterator。我們知道集合分為 Collection和 Map,今天我們的重點是學習 Collection。

什麼是集合

我們再來回顧一下集合解決了什麼問題:在編譯期間不知道要多少個物件,但是陣列必須在申明的時候明確指明陣列長度,如果使用陣列,申請太多的空間就會造成資源浪費,如果申請太少空間,就不夠用,所以引出了一個概念叫“集合”。

從這裡我們可以看出,集合的特性有:

  • 類似於陣列,包含了多個元素的物件
  • 可根據需要動態申請記憶體空間。

因此,我們可以理解集合是一個高階的陣列。可能這種說法不太合理,那我換個說法吧,集合是許多個體組織成的一個整體。

既然是整體,那麼肯定有增刪改查等各種操作,我們前面在物件導向的理解中講了介面的理解:介面就是對一個物件的行為進行規範,使物件具有做某些事情的能力。集合本身只是用來儲存資料的,如果需要具有增刪改查功能,肯定是用介面來擴充套件。不多說了,我們來看程式碼。

不看程式碼了,Collection 就是一個介面,定義了集合的行為規範,我們直接看類結構圖就好。

  • int size(); 獲取元素個數
  • boolean isEmpty();是否為空
  • boolean contains(Object var1);是否包含指定元素
  • Iterator iterator();獲取迭代器
  • Object[] toArray();轉換成陣列
  • T[] toArray(T[] var1);轉換成陣列,指定型別
  • boolean add(E var1);新增一個元素
  • boolean remove(Object var1);刪除一個元素
  • boolean containsAll(Collection<?> var1);是否包含一組元素
  • boolean addAll(Collection<? extends E> var1);新增一組元素
  • boolean removeAll(Collection<?> var1);刪除一組元素
  • default boolean removeIf(Predicate<? super E> var1) 模式實現方法,刪除指定條件元素
  • boolean retainAll(Collection<?> var1);保留本集合中 c 集合中兩者共有的,如果集合有改變就返回 true
  • void clear();清空集合
  • boolean equals(Object var1);比較
  • int hashCode();獲取雜湊值
  • default Spliterator spliterator() 獲取分割迭代器,並行操作
  • default Stream stream() Java 8流式操作
  • default Stream parallelStream() 同上

#集合的抽象實現類 AbstractCollection
AbstractCollection是所有 Collection 系集合的父類。從類結構上來看,List、Set 系列的集合都繼承自 AbstractCollection。

AbstractCollection 沒有太多的程式碼,主要實現了 Collection 介面方法。其實這個類設計還是蠻有意思的。僅僅抽象了兩個方法iterator()和size(),其餘所有的操作都在AbstractCollection 裡面實現了,在資料結構都不清楚的情況下,僅僅通過 iterator 就實現了對集合的增刪改查。如果是我們自己來設計一個集合,能否在不清楚資料結構的情況下,就寫出對集合的增刪改查方法的具體實現呢?我想這就是物件導向程式設計 OOP 的魅力所在吧。

預告

接下來我會根據 List、Set、Queue 三個 Collection 介面的繼承介面來學習 Collection 集合的各種實現。

  • List 基於陣列實現的集合類,元素有序可重複
  • Set 基於 HashMap 實現的集合類,無序且不能重複
  • Queue 基於陣列實現的集合類,模擬佇列,遵循 FIFO

相關文章