Queue用於模擬隊列這種數據結構,新元素插入(offer)到隊列的尾部,訪問元素(poll)操作會返回隊列頭部的元素。通常,隊列不允許隨機訪問隊列中的元素。
Queue接口中定義瞭如下幾個方法。
void add(Object e):將指定元素加入此隊列的尾部
Object element():獲取隊列頭部的元素,但是不刪除該元素
boolean offer(Object e):將指定元素加入此隊列的尾部
Object peek():獲取隊列頭部的元素,如果此隊列爲空,則返回null。
Object poll():獲取隊列頭部的元素,並刪除該元素,如果此隊列爲空,則返回null。
Object remove():獲取隊列頭部元素並刪除
PriorityQueue
public class PriorityQueueTest
{
public static void main(String[] args)
{
PriorityQueue pq = new PriorityQueue();
// 下面代碼依次向pq中加入四個元素
pq.offer(6);
pq.offer(-3);
pq.offer(20);
pq.offer(18);
// 輸出pq隊列,並不是按元素的加入順序排列
System.out.println(pq); // 輸出[-3, 6, 20, 18]
// 訪問隊列第一個元素,其實就是隊列中最小的元素:-3
System.out.println(pq.poll());
}
}
Deque接口與ArrayDeque實現類
Deque接口是Queue接口的子接口,代表一個雙端隊列,Deque接口提供了一個典型的實現類:ArrayDeque。
下面程序示範了把ArrayDeque當成“棧”來使用
public class ArrayDequeStack
{
public static void main(String[] args)
{
ArrayDeque stack = new ArrayDeque();
// 依次將三個元素push入"棧"
stack.push("瘋狂Java講義");
stack.push("輕量級Java EE企業應用實戰");
stack.push("瘋狂Android講義");
// 輸出:[瘋狂Android講義, 輕量級Java EE企業應用實戰, 瘋狂Java講義]
System.out.println(stack);
// 訪問第一個元素,但並不將其pop出"棧",輸出:瘋狂Android講義
System.out.println(stack.peek());
// 依然輸出:[瘋狂Android講義, 瘋狂Java講義, 輕量級Java EE企業應用實戰]
System.out.println(stack);
// pop出第一個元素,輸出:瘋狂Android講義
System.out.println(stack.pop());
// 輸出:[輕量級Java EE企業應用實戰, 瘋狂Java講義]
System.out.println(stack);
}
}
當然ArrayDeque也可以當成隊列使用,此處ArrayDeque將按“先進先出”的方式操作集合元素。
public class ArrayDequeQueue
{
public static void main(String[] args)
{
ArrayDeque queue = new ArrayDeque();
// 依次將三個元素加入隊列
queue.offer("瘋狂Java講義");
queue.offer("輕量級Java EE企業應用實戰");
queue.offer("瘋狂Android講義");
// 輸出:[瘋狂Java講義, 輕量級Java EE企業應用實戰, 瘋狂Android講義]
System.out.println(queue);
// 訪問隊列頭部的元素,但並不將其poll出隊列"棧",輸出:瘋狂Java講義
System.out.println(queue.peek());
// 依然輸出:[瘋狂Java講義, 輕量級Java EE企業應用實戰, 瘋狂Android講義]
System.out.println(queue);
// poll出第一個元素,輸出:瘋狂Java講義
System.out.println(queue.poll());
// 輸出:[輕量級Java EE企業應用實戰, 瘋狂Android講義]
System.out.println(queue);
}
}
LinkedList實現類
LinkedList類是List接口的實現類,可以根據索引來隨機訪問集合中的元素,除此之外,還實現了Deque接口,可以被當成雙端隊列來使用。
public class LinkedListTest
{
public static void main(String[] args)
{
LinkedList books = new LinkedList();
// 將字符串元素加入隊列的尾部
books.offer("瘋狂Java講義");
// 將一個字符串元素加入棧的頂部
books.push("輕量級Java EE企業應用實戰");
// 將字符串元素添加到隊列的頭部(相當於棧的頂部)
books.offerFirst("瘋狂Android講義");
// 以List的方式(按索引訪問的方式)來遍歷集合元素
for (int i = 0; i < books.size() ; i++ )
{
System.out.println("遍歷中:" + books.get(i));
}
// 訪問、並不刪除棧頂的元素
System.out.println(books.peekFirst());
// 訪問、並不刪除隊列的最後一個元素
System.out.println(books.peekLast());
// 將棧頂的元素彈出“棧”
System.out.println(books.pop());
// 下面輸出將看到隊列中第一個元素被刪除
System.out.println(books);
// 訪問、並刪除隊列的最後一個元素
System.out.println(books.pollLast());
// 下面輸出:[輕量級Java EE企業應用實戰]
System.out.println(books);
}
}