標籤:
------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
Queue集合
Queue集合用於類比隊列這種資料結構,隊列通常是指“先進先出‘(FIFO)的容器。隊列
的頭部儲存在隊列中存放時間最長的元素,隊列的尾部儲存咋隊列中存放時間最短的元素。新元
素插入(offer)到隊列的尾部,訪問元素(poll)操作會返回隊列頭部的元素。通常隊列不允許
隨機訪問隊列中的元素。
Queue介面中定義了如下幾個方法:
1)void add(Object o):將指定元素加入此隊列的尾部。
2)Object element():擷取隊列頭部的元素,但是不刪除該元素。
3)boolean offer(Object o):將指定元素加入此隊列的尾部。當時也有容量限制的隊列時,
此方法通常比add(Object o)方法更好
4)Object peek():擷取隊列頭部的元素,但不刪除該元素,如果此隊列為空白,則返回null。
5)Object poll():擷取隊列頭部的元素,刪除該元素,如果此隊列為空白,則返回null。
6)Object remove():擷取隊列頭部的元素,並刪除該元素。
Queue介面有一個PriorityQueue實作類別。此外,Queue還有一個Deque介面,它的實作類別
即可當成隊列使用,也可當成棧使用。Java為Deque提供了ArrayDeque和LinkedList兩個實現類。
1.PriorityQueue實作類別
PriorityQueue是一個比較標準的隊列實作類別。PriorityQueue儲存隊列元素的順序並不是按加
入隊列的順序,而是按隊列元素的大小進行重新排列。因此當調用peek()方法或者poll()方法取出隊
列中的元素時,並不是取出最先進入隊列的元素,而是取出隊列中最小的元素。下面示範了
PriorityQueue隊列的用法。
import java.util.PriorityQueue;public class PriorityQueueTest { public static void main(String[] args) { PriorityQueue pq = new PriorityQueue(); pq.offer(6); pq.offer(-3); pq.offer(9); pq.offer(0); System.out.println(pq); System.out.println(pq.poll()); System.out.println(pq.peek()); }}
運行結果:
[-3, 0, 9, 6]-30
2.Deque介面與ArrayDeque實作類別
Deque介面是Queue介面的子介面,它代表一個雙端隊列,Deque介面裡定義了一些雙端隊列
的方法:
1)void addFirst(Object o):將指定元素插入該雙端隊列的開頭。
2)void addLast(Object o):將指定元素插入該雙端隊列的末尾。
3)Iterator descendingIterator():返回該雙端隊列對應的迭代器,該迭代器將以逆向順序來迭代隊列中的元素。
4)Object getFirst():擷取但不刪除雙端隊列的第一個元素。
5)Object getLast():擷取但不刪除雙端隊列的最後一個元素。
6)boolean offerFirst(Object o):將指定元素插入該雙端隊列的開頭。
7)boolean offerLast(Object o):將指定元素插入該雙端隊列的末尾。
8)Object peekFirst():擷取但不刪除該雙端隊列的第一個元素;如果此雙端隊列為空白,則返回null。
9)Object peekLast():擷取但不刪除該雙端隊列的最後一個元素;如果此雙端隊列為空白,則返回null。
10)Object pollFirst():擷取並刪除該雙端隊列的第一個元素;如果此雙端隊列為空白,則返回null。
11)Object pollLast():擷取並刪除該雙端隊列的最後一個元素;如果此雙端隊列為空白,則返回null。
12)Object pop()(棧方法):pop出該雙端隊列所表示的棧頂元素。相當於removeFirst()。
13)void push(Object o)(棧方法):將一個元素push進該雙端隊列所表示的棧的棧頂。相當於addFirst(o)。
14)Object removeFirst():擷取並刪除該雙端隊列的第一個元素。
15)Object removeFirstOccurrence(Object o):刪除該雙端隊列的第一次出現的元素o。
16)removeLast():刪除該雙端隊列的最後一個元素。
17)removeFirstOccurrence(Object o):刪除該雙端隊列的最後一次出現的元素o。
Deque介面提供了一個典型的實作類別:ArrayDeque,它是一個基於數字實現的雙端隊列,建立Deque時
可以指定一個numElement參數,該參數用於指定Object[]數組的長度;如果不指定numElement參數,
Deque底層數組的長度為16.
提示:ArrayList和arrayDeque兩個集合類的實現機制基本相似,它們的底層都採用一個動態、可重分配的
Object[]數組來儲存集合元素,當集合元素超出了該數組的容器時,系統會在底層重新分配一個Object[]數組
來儲存集合元素。
2.LinkedList實作類別
LinkedList類是List介面的實作類別,此外,LinkedList還實現了Deque介面。下面程式示範了LinkedList集
合的用法。
1 import java.util.LinkedList; 2 3 4 public class LinkedListTest { 5 6 public static void main(String[] args) { 7 8 LinkedList llLinkedList = new LinkedList<>(); 9 //將字串元素排入佇列尾部10 llLinkedList.offer("黑馬程式員");11 //將字串元素加入棧的棧頂12 llLinkedList.push("傳智播客");13 //將字串元素添加到隊列的頭部,相當於棧的頂部14 llLinkedList.offerFirst("CSDN");15 16 for (int i = 0; i < llLinkedList.size(); i++) {17 System.out.println(llLinkedList.get(i));18 }19 //訪問但不刪除棧頂一個元素20 System.out.println(llLinkedList.peekFirst());21 //訪問但不刪除隊列的最後一個元素22 System.out.println(llLinkedList.peekLast());23 //將棧頂的元素彈出“棧”24 System.out.println(llLinkedList.pop());25 //可以看到隊列中的第一個元素被刪除26 System.out.println(llLinkedList);27 //訪問並刪除隊列的最後一個元素28 System.out.println(llLinkedList.pollLast());29 System.out.println(llLinkedList);30 }31 32 }
運行結果:
CSDN傳智播客黑馬程式員CSDN黑馬程式員CSDN[傳智播客, 黑馬程式員]黑馬程式員[傳智播客]
LinkedList與ArrayList、ArrayDeque的實現機制完全不同,ArrayList、ArrayDeque內部
以數組的形式來儲存集合中的元素,因此隨機訪問集合元素時有較好的效能;而LinkedList內部以
鏈表的形式來儲存集合中的元素,因此隨機訪問集合元素時效能較差,但在插入、刪除元素時效能
非常出色(只需改變指標所指的地址即可)。需要指出的是,雖然Vector也是以數組的形式來儲存
集合元素的,但因為他實現了線程同步功能,所以各方面效能都有所下降。
Java——(六)Collection之Queue集合