JDK源碼閱讀——Collection

今天開始閱讀JDK源碼,不知道自己能堅持到哪一步。希望幾個月甚至若干年以後,再看這篇文章,我能夠慶幸自己堅持了下來。
JDK1.8的代碼真是茫茫多,隨便翻一個String類就有4000行,因此我將只挑選常用的方法進行閱讀。
一開始不知從哪下手,乾脆就以java集合框架的根源——Collection接口讀起吧。

public interface Collection<E> extends Iterable<E>

Collection接口繼承了Iterable接口,因此可以用迭代器訪問其中的元素
下面是一些常用方法:

int size();//返回Collection元素個數
boolean isEmpty();//判斷Collection是否爲空
boolean contains(Object o);//判斷元素中是否包含o
Iterator<E> iterator();//返回迭代器
Object[] toArray();//返回一個包含Collection中所有元素的數組,toArray方法需要爲這個數組分配內存空間
boolean add(E e);//將元素e加入Collection中,添加成功返回true,添加失敗(例如這是個Set,不允許包含重複元素)則返回false
boolean remove(Object o);//將o從Collection中去除,成功返回true
boolean containsAll(Collection<?> c);//判斷Collection是否包含c中所有元素
boolean addAll(Collection<? extends E> c);//將C中所有元素加入Collection中,返回值同add方法
boolean removeAll(Collection<?> c);//將c中所有元素從Collection中去除
boolean retainAll(Collection<?> c);//從Collection中移除所有不在c中的元素
void clear();//清除Collection中所有元素
boolean equals(Object o);//判斷Collection與o是否相等
int hashCode();//返回Collection的hash值

除此之外,還有default方法removeIf,該方法從Collection中移除符合條件的元素:

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;
}

在java 8中,default和static修飾的關鍵字均可以在接口中被實現,其中default關鍵字的作用是爲了在接口中添加新的方法之後仍保持兼容。繼承了該接口的類可以覆蓋default方法,但這不是必須的。
需要注意的是,當兩個接口給同一個方法都提供了default實現的時候,這個方法是無法被調用的,除非實現類也實現了這個default方法。
回到removeIf方法上,該方法首先判斷filter是否爲空,若不爲空則使用迭代器依次返回Collection的元素,並調用filter.test方法進行驗證,符合條件的元素被移除。若有元素被移除,removeIf方法返回true。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章