1. 程式人生 > 實用技巧 >JDK 集合 Collection

JDK 集合 Collection

一、繼承關係圖

二、介面方法說明

Collection介面繼承自Iterable介面,它是集合樹的最頂層節點,它總共定義了15個方法:

//返回集合中元素的個數

int size();

//判斷集合是否為空

boolean isEmpty();

//判斷集合中是否包含指定物件

boolean contains(Object o);

//返回集合的迭代器

Iterator<E> iterator();

//將集合轉換成陣列

Object[] toArray();

//按照泛型將集合轉換成陣列

<T> T[] toArray(T[] a);

//在集合中增加指定元素

boolean add(E e);

//從集合中移除指定元素

boolean remove(Object o);

//判斷集合是否包含了指定集合的所有元素

boolean containsAll(Collection<?> c);

//將指定集合的所有元素增加到集合中

boolean addAll(Collection<? extends E> c);

//從集合中移除指定集合的所有元素

boolean removeAll(Collection<?> c);

//只保留指定集合中包含的元素

boolean retainAll(Collection<?> c);

//移除集合中所有的元素

void clear();

//將集合與指定物件進行比較

boolean equals(Object o);

//返回集合的hashcode值

int hashCode();

三、重點繼承實現子類

 * @author  Josh Bloch
 * @author  Neal Gafter
 * @see     Set
 * @see     List
 * @see     Map
 * @see     SortedSet
 * @see     SortedMap
 * @see     HashSet
 * @see     TreeSet
 * @see     ArrayList
 * @see     LinkedList
 
* @see Vector * @see Collections * @see Arrays * @see AbstractCollection * @since 1.2

四、原始碼分析

  1 public interface Collection<E> extends Iterable<E> {
  2     // Query Operations    原註釋,不明意義
  3 
  4     //定義size方法,應返回size大小,最大值為Integer.MAX_VALUE
  5     int size();
  6 
  7     //定義isEmpty方法,用於返回是否為空
  8     boolean isEmpty();
  9 
 10     //定義contains方法,判斷一個obj是否屬於此集合
 11     boolean contains(Object o);
 12 
 13     //定義迭代器方法,返回一個迭代器物件
 14     Iterator<E> iterator();
 15 
 16     //定義轉換為轉換Obj陣列的方法,返回一個obj陣列
 17     Object[] toArray();
 18 
 19     //定義轉換為泛型T陣列的方法,返回一個指定泛型的陣列
 20     <T> T[] toArray(T[] a);
 21 
 22     //定義add方法,新增一個元素e,並返回新增成功標誌
 23     boolean add(E e);
 24 
 25     //定義remove方法,移除一個元素obj,並返回移除元素成功標誌
 26     boolean remove(Object o);
 27 
 28     //定義containsAll方法,判斷是否包含集合例項物件c
 29     boolean containsAll(Collection<?> c);
 30 
 31     //定義addAll方法,新增集合例項物件c到本例項中
 32     boolean addAll(Collection<? extends E> c);
 33 
 34     //定義removeAll方法,從本例項中移除集合實力物件c
 35     boolean removeAll(Collection<?> c);
 36 
 37 
 38     /**
 39      * jdk8新增
 40      * 大意為:
 41      * 定義removeIf方法,該方傳遞引數為函式式,傳遞內容是一個介面型別,該介面型別
 42      * 定義為一個filter函式,該函式用於傳遞給Objects.requireNonNull判斷,然後呼叫
 43      * 迭代器,將滿足該定義的filter的本例項中的元素移除
 44      * @since 1.8
 45      */
 46     default boolean removeIf(Predicate<? super E> filter) {
 47         Objects.requireNonNull(filter);
 48         boolean removed = false;
 49         final Iterator<E> each = iterator();
 50         while (each.hasNext()) {
 51             if (filter.test(each.next())) {
 52                 each.remove();
 53                 removed = true;
 54             }
 55         }
 56         return removed;
 57     }
 58 
 59     //定義retainAll方法,取本例與集合例項c的交集,判斷交集元素數量是否大於0
 60     boolean retainAll(Collection<?> c);
 61 
 62     //定義clear方法,清除本例集合中的所有元素
 63     void clear();
 64 
 65     // Comparison and hashing    原註釋,不明意義
 66 
 67     //不解釋
 68     boolean equals(Object o);
 69 
 70     //定義hashCode方法,獲取hashCode標記的方法
 71     int hashCode();
 72 
 73     /**
 74      *jdk8新增
 75      *大意為:
 76      *將迭代器拆分,重寫自Iterable介面,從已知元素數量的本例中返回拆分後的迭代器
 77      *此方法返回的為本類本身
 78      *子類可能重寫迭代器拆分,將一個集合的迭代拆分為多個集合的迭代交由多個執行緒
 79      * @since 1.8
 80      */
 81     @Override//重寫父類
 82     default Spliterator<E> spliterator() {
 83         return Spliterators.spliterator(this, 0);
 84     }
 85 
 86     /**
 87      * jdk8新增
 88      * 大意為:
 89      * 將預設的迭代器拆分後的結果,聚合為流,該流並非io中的流,
 90      * 是一種類似於資料排序操作流
 91      * @since 1.8
 92      */
 93     default Stream<E> stream() {
 94         return StreamSupport.stream(spliterator(), false);
 95     }
 96 
 97     /**
 98      * jdk8新增
 99      * 同上,但是具體其他的實現中,因為可並行,所以可能是執行緒不安全的
100      *
101      * @since 1.8
102      */
103     default Stream<E> parallelStream() {
104         return StreamSupport.stream(spliterator(), true);
105     }
public interface Iterable<T> {

    //定義iterator方法,返回迭代器
    Iterator<T> iterator();

    /**
     * jdk8新增
     * 大意為:
     * 根據action呼叫Objects.requireNonNull進行過濾
     * 過濾結果呼叫for迴圈取出,
     * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    /**
     * jdk8新增
     * 大意為:
     * 分離迭代器,將未知大小的迭代器進行拆分,返回拆分的迭代器本身
     *
     * @since 1.8
     */
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

五、Collection是所有集合的基類,因此介面中抽象的操作都是集合的共性操作

集合作為容器,其體系中的所有集合都包括了:

  大小(size),判空(isEmpty),新增元素(add),刪除元素(remove),是否包含(contains)

  轉換陣列(toArray),清空(clear),遍歷與迭代(forEach(父介面中),iterator)

  是否相同(equals),雜湊(hashCode),求交集(retainAll)

  除此之外,提供了java8的分離介面,聚合介面,為了大容量集合的多執行緒操作