Java集合原始碼學習(1)介面

快樂的博格巴發表於2018-09-27

最近看到《Java核心技術 卷Ⅰ》集合的部分,知道這是很重要的一部分內容,特地學習一下集合的原始碼。本來是想在CSDN上面寫的,但是CSDN社群的環境太亂了,恰好在掘金上看到了“大大紙飛機”同學寫的集合相關的文章很不錯。所以轉戰掘金。

Java集合框架包含了很多的資料結構,主要包括 List列表、Set集合、Map對映、迭代器(Iterator、Enumeration)、工具類(Arrays、Collections)幾個部分。

集合框架的介面

畫圖使用了:processon.com

Java集合原始碼學習(1)介面
其中有兩個最基本的介面:Collection和Map。 而List、Set和Queue介面又繼承了Collection介面。SortedMap介面繼承了Map介面。

(1)Collection介面
public interface Collection<E> extends Iterable<E>
Collection介面包含了我們平時使用的一些方法:

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);
複製程式碼

(2)List介面
List是一個繼承自Collection的介面,List是集合中的一種。List是有序的佇列,List中的每一個元素都有一個索引;第一個元素的索引值是0,往後的元素的索引值依次+1。和Set不同,List中允許有重複的元素。
(3)Set介面
Set介面也是集合中的一種。Set的add方法不允許增加重複的元素。可以適當的定義equals方法:只要兩個集包含同樣的元素就認為是相等的,而不要求這些元素有同樣的順序。hashCode方法的定義要保證包含相同元素的兩個集會得到相同的雜湊碼。
SortedSet會提供用於排序的比較器物件。

public interface Set<E> extends Collection<E>{
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();//迭代器物件
        @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT);//並行遍歷的迭代器
    }
}
複製程式碼

(4)Queue介面
Queue介面也繼承自Collection介面,實現了佇列的資料結構:

boolean add(E e);//增加一個元索
boolean offer(E e);//新增一個元素並返回true,如果佇列已滿,則返回false
E remove();//移除並返回佇列頭部的元,如果佇列為空,則丟擲一個NoSuchElementException異常
E poll();//移除並返問佇列頭部的元素,如果佇列為空,則返回null
E element();//返回佇列頭部的元素,如果佇列為空,則丟擲一個NoSuchElementException異常
E peek();//返回佇列頭部的元素,如果佇列為空,則返回null  
複製程式碼

(5)Iterator介面
Iterator集合的迭代器。集合可以通過Iterator去遍歷集合中的元素。Iterator提供的API介面,包括:是否存在下一個元素、獲取下一個元素、刪除當前元素。

boolean hasNext();
E next();

default void remove() {
    throw new UnsupportedOperationException("remove");
}

default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}  
複製程式碼

(6)Map介面
提供了對映需要的基本方法:

int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
V put(K key, V value);
V remove(Object key);
void putAll(Map<? extends K, ? extends V> m);
void clear();
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
複製程式碼

(7)SortedMap介面
SortedMap與SortedSet介面會提供用於排序的比較器物件。

public interface SortedMap<K,V> extends Map<K,V>{
    Comparator<? super K> comparator();
    SortedMap<K,V> subMap(K fromKey, K toKey);
    SortedMap<K,V> headMap(K toKey);
    SortedMap<K,V> tailMap(K fromKey);
    K firstKey();
    K lastKey();
    Set<K> keySet();
    Collection<V> values();
    Set<Map.Entry<K, V>> entrySet();
}  
複製程式碼

(8)Iterator介面

public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    //主要將每個元素作為引數發給action來執行特定操作
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}
複製程式碼

相關文章