前面我們講到了集合的定義以及集合的 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