java集合類源碼學習一


 對於java的集合類,首先看張圖

 

這張圖大致描繪出了java集合類的總覽,兩個體系,一個Collection集合體系一個Map集合體系。在說集合類之前,先說說Iterable這個接口,這個接口在jdk1.8之前,里面只有一個方法Iterator<T> iterator(),即返回一個T類型的迭代器,在1.8增加了兩個default修飾的方法

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

 這都是為了實現java函數式編程而加進去的方法,具體使用在這篇里面先不說,以后專門弄一篇來說這個。還有一個接口Iterator<E>,里面包含兩個方法boolean hasNext()以及E next(),這兩個方法一個用來判斷集合有沒有下一個元素,一個用來取出下一個元素。同樣Iterator里有兩個default方法,先跳過。Iterable接口的作用是,如果一個類實現了這個接口,或者它實現得接口繼承了這個接口,那么它就可以用增強for循環來循環獲得集合中的元素(雖然其實也是用了迭代器);Iterator接口的作用是,如果一個類或它的父類實現了這個接口,那么就可以顯式地用迭代器的hasNext()和next()來循環取值。下面我們來看看Collection接口:

public interface Collection<E> extends Iterable<E> {
    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); 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; } boolean retainAll(Collection<?> c); void clear(); boolean equals(Object o); int hashCode(); @Override default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); } default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } default Stream<E> parallelStream() { return StreamSupport.stream(spliterator(), true); } }

 拋開default方法,剩下的15個方法就是Collection集合系的最基本方法,將在它的實現類里面加以實現,這些方法的名稱對應作用都很明顯,就不細講了,值得注意的是,這個接口繼承了Iterable<E>接口,里面有個Iterator<E> iterator();方法,這意味着Collection集合系的實現類都可以用增強for循環來取值。在eclipse里Collection接口按F4查看引用,如下圖

我們可以看到下面三個接口繼承Collection接口(BeanContext不是java.util包下的,忽略),List,Queue和Set,以及一些實現類。這三個接口和圖上的對應起來,我們一一來查看。先看List接口,它首先有Collection接口里的所有方法(不包含Collection的default方法),然后有幾個自己的方法,需要注意的是里面有個listIterator方法,這個玩意也是個迭代器,不過比起Iterator,這玩意多了幾個功能,其實相當於Iterator的一個擴展:

public interface ListIterator<E> extends Iterator<E> {

boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}

 方法的意思也比較明朗,不過set方法是設置最后的值而add方法是往當前索引的前面加值。List有了這個迭代器,就可以任性取值了。同樣地,看看Set接口和Queue接口,發現Set接口的方法基本和Collection里的一樣,而Queue接口幾乎完全不一樣,除了add和remove方法,那么它應該是在子類或繼承它的接口里去實現了Collection剩余的方法。好,明天繼續學習。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM