【集合類】源碼解析之 Queue接口、AbstractQueue抽象類、Deque接口

Queue接口

隊列,除了基本的Collection操作之外,隊列還提供額外的插入,提取和檢查操作。 這些方法中的每一種都有兩種形式:如果操作失敗,則拋出一個異常,另一種形式返回一個特殊值( null或false ,具體取決於操作)。

通常(但不一定)是以FIFO(先進先出)方式排序元素
例外情況包括優先級隊列(根據提供的比較器對元素進行排序)和LIFO隊列(或堆棧)(後進先出)

類聲明

public interface Queue<E> extends Collection<E> 

共性方法

/**
 * 將指定元素插入到此隊列中
 * IllegalStateException - 如果由於容量限制,此時無法添加該元素 
 * ClassCastException - 如果指定元素的類阻止將其添加到此隊列中 
 * NullPointerException - 如果指定的元素爲空,並且該隊列不允許空元素 
 * IllegalArgumentException - 如果此元素的某些屬性阻止將其添加到此隊列 
 */
boolean add(E e);

/**
 * 將指定元素插入到此隊列中,如果超出隊列界限則返回false
 * ClassCastException - 如果指定元素的類阻止將其添加到此隊列中
 * NullPointerException - 如果指定的元素爲空,並且該隊列不允許空元素
 * IllegalArgumentException - 如果此元素的某些屬性阻止將其添加到此隊列
 */
boolean offer(E e);

/**
 * 檢索並刪除此隊列的頭
 * NoSuchElementException - 如果這個隊列是空的 
 */
E remove();

/**
 * 檢索並刪除此隊列的頭,如果此隊列爲空,則返回 null 
 */
E poll();

/**
 * 檢索但不刪除這個隊列的頭部
 * NoSuchElementException - 如果這個隊列是空的 
 */
E element();

/**
 * 檢索但不刪除此隊列的頭部,如果此隊列爲空,則返回 null
 */
E peek();

AbstractQueue抽象類

類聲明

public abstract class AbstractQueue<E> extends AbstractCollection<E> implements Queue<E>

方法實現

// 唯一的構造器 給子類初始化使用
protected AbstractQueue() {
}

// 調用offer
public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}

// 調用poll
public E remove() {
    E x = poll();
    if (x != null)
        return x;
    else
        throw new NoSuchElementException();
}

// 調用peek
public E element() {
    E x = peek();
    if (x != null)
        return x;
    else
        throw new NoSuchElementException();
}

// 循環調用poll直至返回null
public void clear() {
    while (poll() != null)
        ;
}

// 添加集合中的所有元素近隊列,如果在添加元素中遇到運行時異常會導致拋出異常時已成功添加了一部份
public boolean addAll(Collection<? extends E> c) {
    if (c == null)
        throw new NullPointerException();
    if (c == this)
        throw new IllegalArgumentException();
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

Deque接口

雙端隊列 (double ended queue),支持在兩端插入和移除元素

此接口支持容量受限的deque以及沒有固定大小限制的deque,大多數deque的實現對元素的數量沒有固定限制

類聲明

public interface Deque<E> extends Queue<E>

Queue 方法

boolean add(E e);

boolean offer(E e);

E remove();

E poll();

E element();

E peek();

相似行爲

當deque用作隊列時,FIFO(先進先出)行爲將產生。元素添加在deque的末尾,並從開頭刪除

void addLast(E e); // 等價於 boolean add(E e)

boolean offerLast(E e); // 等價於 boolean offer(E e)

E removeFirst(); // 等價於 E remove()

E pollFirst(); // 等價於 E poll()

E getFirst(); // 等價於 E element()

E peekFirst(); // 等價於 E peek()

Stack 方法

/**
 * 將元素推送到由此deque表示的堆棧(換句話說,在此deque的頭部)
 * IllegalStateException - 如果由於容量限制,此時無法添加該元素
 * ClassCastException - 如果指定元素的類阻止將其添加到此deque
 * NullPointerException - 如果指定的元素爲空,並且此deque不允許空元素
 * IllegalArgumentException - 如果指定元素的某些屬性阻止將其添加到此deque
 */
void push(E e);

/**
 * 從這個deque表示的堆棧中彈出一個元素(在此deque的頭部)
 * NoSuchElementException - 如果這個deque是空的 
 */
E pop();

相似行爲

當隊列用作的堆棧時,LIFO(後進先出)行爲將產生。元素從deque的開頭被推入和彈出

void addFirst(E e); // 等價於 void push(E e);

E removeFirst(); // 等價於 E pop();

E peekFirst(); // 等價於 E peek()

其他方法

// 隊頭插入元素,若不成功返null
boolean offerFirst(E e);

// 隊尾刪除並返回元素,若隊列爲空則拋異常
E removeLast();

// 隊尾刪除並返回元素,若隊列爲空則返null
E pollLast();

// 檢索隊尾元素,若隊列爲空則拋異常
E getLast();

//  檢索隊尾元素,若隊列爲空則返null
E peekLast();

// 從此deque中刪除指定元素的第一個匹配項
boolean removeFirstOccurrence(Object o);

// 從此deque中刪除指定元素的最後一個匹配項
boolean removeLastOccurrence(Object o);

// *** Collection methods ***

boolean remove(Object o);

boolean contains(Object o);

public int size();

Iterator<E> iterator();

// 以相反的順序返回deque中的迭代器
Iterator<E> descendingIterator();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章