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