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

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

什麼是集合

咱們再來回顧一下集合解決了什麼問題:在編譯期間不知道要多少個對象,可是數組必須在申明的時候明確指明數組長度,若是使用數組,申請太多的空間就會形成資源浪費,若是申請太少空間,就不夠用,因此引出了一個概念叫「集合」。數組

從這裏咱們能夠看出,集合的特性有:數據結構

  • 相似於數組,包含了多個元素的對象
  • 可根據須要動態申請內存空間。

所以,咱們能夠理解集合是一個高級的數組。可能這種說法不太合理,那我換個說法吧,集合是許多個體組織成的一個總體。學習

既然是總體,那麼確定有增刪改查等各類操做,咱們前面在面向對象的理解中講了接口的理解:接口就是對一個對象的行爲進行規範,使對象具備作某些事情的能力。集合自己只是用來存儲數據的,若是須要具備增刪改查功能,確定是用接口來擴展。很少說了,咱們來看代碼。.net

不看代碼了,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。3d

AbstractCollection 沒有太多的代碼,主要實現了 Collection 接口方法。其實這個類設計仍是蠻有意思的。僅僅抽象了兩個方法iterator()和size(),其他全部的操做都在AbstractCollection 裏面實現了,在數據結構都不清楚的狀況下,僅僅經過 iterator 就實現了對集合的增刪改查。若是是咱們本身來設計一個集合,可否在不清楚數據結構的狀況下,就寫出對集合的增刪改查方法的具體實現呢?我想這就是面向對象編程 OOP 的魅力所在吧。cdn

預告

接下來我會根據 List、Set、Queue 三個 Collection 接口的繼承接口來學習 Collection 集合的各類實現。對象

  • List 基於數組實現的集合類,元素有序可重複
  • Set 基於 HashMap 實現的集合類,無序且不能重複
  • Queue 基於數組實現的集合類,模擬隊列,遵循 FIFO
相關文章
相關標籤/搜索