Java容器深入淺出之PriorityQueue、ArrayDeque和LinkedList
阿新 • • 發佈:2018-11-05
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 }