前面我們講到了集合的定義以及集合的 Iterator辈挂。我們知道集合分為 Collection和 Map,今天我們的重點是學習 Collection牙捉。
什么是集合
我們再來回顧一下集合解決了什么問題:在編譯期間不知道要多少個對象,但是數組必須在申明的時候明確指明數組長度水孩,如果使用數組满葛,申請?zhí)嗟目臻g就會造成資源浪費径簿,如果申請?zhí)倏臻g,就不夠用嘀韧,所以引出了一個概念叫“集合”篇亭。
從這里我們可以看出,集合的特性有:
- 類似于數組锄贷,包含了多個元素的對象
- 可根據需要動態(tài)申請內存空間译蒂。
因此,我們可以理解集合是一個高級的數組谊却∪嶂纾可能這種說法不太合理,那我換個說法吧炎辨,集合是許多個體組織成的一個整體捕透。
既然是整體,那么肯定有增刪改查等各種操作碴萧,我們前面在面向對象的理解中講了接口的理解:接口就是對一個對象的行為進行規(guī)范乙嘀,使對象具有做某些事情的能力。集合本身只是用來存儲數據的破喻,如果需要具有增刪改查功能虎谢,肯定是用接口來擴展。不多說了曹质,我們來看代碼嘉冒。
不看代碼了,Collection 就是一個接口咆繁,定義了集合的行為規(guī)范讳推,我們直接看類結構圖就好。
- int size(); 獲取元素個數
- boolean isEmpty();是否為空
- boolean contains(Object var1);是否包含指定元素
- Iterator<E> iterator();獲取迭代器
- Object[] toArray();轉換成數組
- <T> 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<E> spliterator() 獲取分割迭代器坏为,并行操作
- default Stream<E> stream() Java 8流式操作
- default Stream<E> parallelStream() 同上
集合的抽象實現類 AbstractCollection
AbstractCollection是所有 Collection 系集合的父類究驴。從類結構上來看,List匀伏、Set 系列的集合都繼承自 AbstractCollection洒忧。
AbstractCollection 沒有太多的代碼,主要實現了 Collection 接口方法够颠。其實這個類設計還是蠻有意思的熙侍。僅僅抽象了兩個方法iterator()和size(),其余所有的操作都在AbstractCollection 里面實現了,在數據結構都不清楚的情況下蛉抓,僅僅通過 iterator 就實現了對集合的增刪改查庆尘。如果是我們自己來設計一個集合,能否在不清楚數據結構的情況下巷送,就寫出對集合的增刪改查方法的具體實現呢驶忌?我想這就是面向對象編程 OOP 的魅力所在吧。
預告
接下來我會根據 List笑跛、Set付魔、Queue 三個 Collection 接口的繼承接口來學習 Collection 集合的各種實現。
- List 基于數組實現的集合類飞蹂,元素有序可重復
- Set 基于 HashMap 實現的集合類几苍,無序且不能重復
- Queue 基于數組實現的集合類,模擬隊列晤柄,遵循 FIFO