1. 程式人生 > >java佇列Queue方法

java佇列Queue方法

        Queue是一種很常見的資料結構型別,在java裡面Queue是一個介面,它只是定義了一個基本的Queue應該有哪些功能規約。實際上有多個Queue的實現,有的是採用線性表實現,有的基於連結串列實現。還有的適用於多執行緒的環境。java中具有Queue功能的類主要有如下幾個:AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityBlockingQueue, PriorityQueue和ArrayDqueue。

        Queue本身是一種先入先出的模型(FIFO),和我們日常生活中的排隊模型很類似。根據不同的實現,他們主要有陣列和連結串列兩種實現形式。如下圖:



        在jdk裡幾個常用佇列實現之間的類關係圖如下:


        我們可以看到,Deque也是一個介面,它繼承了Queue的介面規範。其中LinkedList和ArrayDeque都是實現Deque介面,所以,可以說他們倆都是雙向佇列。Queue作為一個介面,它宣告的幾個基本操作無非就是入隊和出隊的操作,具體定義如下:

public interface Queue<E> extends Collection<E> {

    boolean add(E e); // 新增元素到佇列中,相當於進入隊尾排隊。如果已滿,丟擲異常

    boolean offer(E e);  //新增元素到佇列中,相當於進入隊尾排隊.

    E remove(); //移除隊頭元素,如果為空,丟擲異常

    E poll();  //移除隊頭元素,如果為空,返回null

    E element(); //獲取但不移除佇列頭的元素,如果為空,丟擲異常

    E peek();  //獲取但不移除佇列頭的元素,如果為空,返回null
}

Deque

       按照我們一般的理解,Deque是一個雙向佇列,這將意味著它不過是對Queue介面的增強。如果仔細分析Deque介面程式碼的話,我們會發現它裡面主要包含有4個部分的功能定義。

       1. 雙向佇列特定方法定義。 

       2. Queue方法定義。 

       3. Stack方法定義。

       4. Collection方法定義。
       其中第3,4部分的方法相當於告訴我們,具體實現Deque的類我們也可以把他們當成Stack和普通的Collection來使用。這也是介面定義規約帶來的好處。這裡我們就不再贅述。我們重點來對Queue相關的定義方法做一下概括:
       

       add相關的方法有如下幾個:

boolean add(E e);

boolean offer(E e);

void addFirst(E e);

void addLast(E e);

boolean offerFirst(E e);

boolean offerLast(E e);

       這裡定義了add, offer兩個方法,從doc說明上來看,兩者的基本上沒什麼區別。之所以定義了這兩個方法是因為Deque繼承了Collection, Queue兩個介面,而這兩個介面中都定義了增加元素的方法宣告。他們本身的目的是一樣的,只是在佇列裡頭,新增元素肯定只是限於在佇列的頭或者尾新增。而offer作為一個更加適用於佇列場景中的方法,也有存在的意義。他們的實現基本上一樣,只是名字不同罷了。

       

        remove相關的方法:

E removeFirst();

E removeLast();

E pollFirst();

E pollLast();

E remove();

E poll();
        get元素相關的方法:
E getFirst();

E getLast();

E peekFirst();

E peekLast();

E element();

E peek();

例子

import java.util.Queue;
import java.util.LinkedList;
public class TestQueue {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<String>();
        queue.offer("Hello");
        queue.offer("World!");
        queue.offer("你好!");
        System.out.println(queue.size());
        String str;
        while((str=queue.poll())!=null){
            System.out.print(str);
        }
        System.out.println();
        System.out.println(queue.size());
    }
}