1. 程式人生 > >Java基礎系列(三十九):集合之Collection

Java基礎系列(三十九):集合之Collection

Collection是在前文中已經介紹過了,他是兩種集合型別之一的父介面,首先我們來看一下它的框架結構

框架圖

在這裡插入圖片描述

可以看出,作為頂級的框架,Collection僅僅是繼承了Iterable介面,接下來,我們來看一下Iterable的原始碼,看看有什麼收穫。

public interface Iterable<T> {
   
    Iterator<T> iterator();
    
    default void forEach(Consumer<? super T> action) {
        Objects.
requireNonNull(action); for (T t : this) { action.accept(t); } } default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } }

可以看到這個介面中有三個方法,其中iterator()方法可以給我們提供一個迭代器,這個在之前的教程就已經說過了,而forEach()方法提供了一個函式式介面的引數,我們可以使用lambda

表示式結合來使用:

Collection<String> collection = ...;
collection.forEach(String s -> System.out.println(s));

這樣就可以獲取到每個值,它的底層實現是加強for迴圈,實際上也是迭代器去遍歷,因為編譯器會把加強for迴圈編譯為迭代遍歷。
Spliterator()1.8新加的方法,字面意思可分割的迭代器,不同以往的iterator()需要順序迭代,Spliterator()可以分割為若干個小的迭代器進行並行操作,既可以實現多執行緒操作提高效率,又可以避免普通迭代器的fail-fast

(fail-fast機制是java集合中的一種錯誤機制。當多個執行緒對同一個集合的內容進行操作時,就可能會產生fail-fast事件)機制所帶來的異常。Spliterator()可以配合1.8新加的Stream()進行並行流的實現,大大提高處理效率。具體的使用方法會在講解Stream()的時候進行講解。

Collection原始碼

接下來,我們來看一下Collection的原始碼,



public interface Collection<E> extends Iterable<E> {
    
    //1
    int size();

    //2
    boolean isEmpty();

    //3
    boolean contains(Object o);

    //4
    Iterator<E> iterator();

    //5
    Object[] toArray();

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

    //7
    boolean add(E e);

    //8
    boolean remove(Object o);

    //9
    boolean containsAll(Collection<?> c);

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

    //11
    boolean removeAll(Collection<?> c);

    //12
    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }

    //13
    boolean retainAll(Collection<?> c);

    //14
    void clear();
    
    //15
    boolean equals(Object o);

    //16
    int hashCode();

    //17
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }
    
    //18
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }

    //19
    default Stream<E> `parallelStream`() {
        return StreamSupport.stream(spliterator(), true);
    }
}

可以看到,Collection()中提供了19個介面方法。接下來,我們來了解一下這些方法的作用:

  1. size(),返回當前儲存在集合中的元素個數。
  2. isEmpty(),如果集合中沒有元素,返回true。
  3. contains(Object obj),如果集合中包含了一個與obj相等的物件,返回true。
  4. iterator(),返回這個集合的迭代器。
  5. toArray(),返回這個集合的物件陣列
  6. toArray(T[] arrayToFill),返回這個集合的物件陣列,如果arrayToFill足夠大,就將集合中的元素填入這個陣列中。剩餘空間填補null;否則,分配一個新陣列,其成員型別與arrayToFill的成員型別相同,其長度等於集合的大小,並填充集合元素。
  7. add(Object element),將一個元素新增到集合中,如果由於這個呼叫改變了集合,返回true。
  8. remove(Object obj),從集合中刪除等於obj的物件,如果有匹配的物件被刪除,返回true。
  9. containsAll(Collection<?> other),如果這個集合包含other集合中的所有元素,返回true。
  10. addAll(Collection<? extends E> other),將other集合中的所有元素新增到這個集合,如果由於這個呼叫改變了集合,返回true。
  11. removeAll(Collection<?> other),從這個集合中刪除other集合中存在的所有元素。如果由於這個呼叫改變了集合,返回true。
  12. removeIf(Predicate<? super E> filter),從這個集合刪除filter返回true的所有元素,如果由於這個呼叫改變了集合,則返回true。
  13. retainAll(Collection<?> other),從這個集合中刪除所有與other集合中的元素不同的元素。如果由於這個呼叫改變了集合,返回true。
  14. clear(),從這個集合中刪除所有的元素。
  15. equals(Object o),如果兩個集合物件相等返回true。
  16. hashCode(),返回該集合物件的雜湊值。
  17. spliterator(),返回分割後的若干個小的迭代器。
  18. stream(),返回這個集合對於的流物件。
  19. parallelStream(),返回這個集合的並行流物件。

可以看到,作為第一級的集合介面,Collection提供了一些基礎操作(增,刪),並且可以通過實現Iterable介面獲取一個迭代器去遍歷獲取集合中的元素。

下節預告

下節我們來講AbstractCollction這個類,作為Collection的第一級子類,它又給我們提供了什麼作用呢?

公眾號

在這裡插入圖片描述