1. 程式人生 > >Java容器深入淺出之PriorityQueue、ArrayDeque和LinkedList

Java容器深入淺出之PriorityQueue、ArrayDeque和LinkedList

Queue用於模擬一種FIFO(first in first out)的佇列結構。一般來說,典型的佇列結構不允許隨機訪問佇列中的元素。佇列包含的方法為:

1. 入隊

void add(Object o): 指定元素加入佇列尾部

boolean offer(Object o):同上,在有限容量佇列中,此方法更好

2. 出隊

Object poll():獲取頭部元素,並從佇列中刪除;如果佇列為空,則返回null

Object remove():獲取頭部元素,並從佇列中刪除;

3. 出隊不刪除

Object peek():獲取頭部元素,不刪除;如果佇列為空,則返回null

Object element():獲取頭部元素,不刪除;

PriorityQueue

PriorityQueue是Queue介面的實現類,但是它並不是一個FIFO的佇列實現,具體表現在:

1. 儲存順序與FIFO無關,而是按照元素大小進行重排序;因此poll出來的是按照有小到大來取。

2. 不允許儲存null,排序規則有自然排序和定製排序兩種,規則與TreeSet一致。

Deque介面與ArrayDeque實現類

Deque實現的是一個雙端佇列,因此它具有“FIFO佇列”及“棧”的方法特性,其中ArrayDeque是其典型的實現類。

1. ArrayDeque的棧實現

 1 public class ArrayDequeStack {
2 3 public static void main(String[] args) { 4 ArrayDeque<String> stack = new ArrayDeque<>(); 5 //壓棧,此時AAA在最下,CCC在最外 6 stack.push("AAA"); 7 stack.push("BBB"); 8 stack.push("CCC"); 9 System.out.println(stack); 10 //獲取最後新增的元素,但不刪除
11 System.out.println(stack.peek()); 12 System.out.println(stack); 13 //彈出最後新增的元素 14 System.out.println(stack.pop()); 15 System.out.println(stack); 16 } 17 18 }

2. ArrayDeque的FIFO佇列實現

 1 public class ArrayDequeQueue {
 2 
 3     public static void main(String[] args) {
 4         ArrayDeque<String> queue = new ArrayDeque<>();
 5         //入隊
 6         queue.offer("AAA");
 7         queue.offer("BBB");
 8         queue.offer("CCC");
 9         System.out.println(queue);
10         //獲取但不出隊
11         System.out.println(queue.peek());
12         System.out.println(queue);
13         //出隊
14         System.out.println(queue.poll());
15         System.out.println(queue);
16     }
17 
18 }

LinkedList實現類

LinkedList比較特殊,它既實現了List介面,同時也實現了Deque介面。因此它具備了List、佇列和棧的特性,在應用開發中有廣泛的用途。

 1 public class TestLinkedList {
 2 
 3     public static void main(String[] args) {
 4         LinkedList<String> ll = new LinkedList<>();
 5         //入隊
 6         ll.offer("AAA");
 7         //壓棧
 8         ll.push("BBB");
 9         //雙端的另一端入隊
10         ll.addFirst("NNN");
11         ll.forEach(str -> System.out.println("遍歷中:" + str));
12         //獲取隊頭
13         System.out.println(ll.peekFirst());
14         //獲取隊尾
15         System.out.println(ll.peekLast());
16         //彈棧
17         System.out.println(ll.pop());
18         System.out.println(ll);
19         //雙端的後端出列
20         System.out.println(ll.pollLast());
21         System.out.println(ll);
22     }
23 }