隊列、雙端隊列和優先級隊列java
隊列能夠有效地在尾部添加一個元素,在頭部刪除一個元素。有兩個端頭的隊列叫雙端隊列。this
能夠有效地在頭部和尾部添加或刪除元素,但不支持在隊列中間添加元素。JavaSE6中引入了Deque接口,並由ArrayDeque和LinkedList類實現。spa
add(E element);offer(E element);code addFirst(E element);offerFirst(E element);排序 addLast(E element);offerLast(E element); |
將給定元素添加到雙端隊列的頭部或尾部。若是隊列滿了,add*(E element)方法將拋出IllegalStateException異常,而offer*(E element)方法返回false。隊列 |
remove();poll();element removeFirst();pollFirst();rem removeLast();pollLast(); |
若是隊列不爲空,刪除並返回隊列頭部或尾部的元素。若是隊列爲空,remove*()方法將拋出NoSuchElementException異常,而poll*()方法返回null。 |
element();peek();get getFirst();peekFirst(); getLast();peekLast(); |
若是隊列不爲空,返回隊列頭部或尾部的元素。若是隊列爲空,element()方法和get*()方法將拋出NoSuchElementException異常,而peek*()方法返回null。 |
優 先級隊列(priority queue)中的元素能夠按照任意的順序插入,但卻老是按照排序的順序進行檢索。不管什麼時候調用remove方法,總會得到當前優先級隊列中最小的元素。優 先級隊列並無對全部的元素進行排序,而是使用了堆(heap)。堆是一個能夠自我調整的二叉樹,能夠讓最小的元素移動到根,而沒必要花費時間對元素進行排 序。
public class Task { public Task() { } public Task(String name, int priority) { super(); this.name = name; this.priority = priority; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPriority() { return priority; } public void setPriority(int priority) { this.priority = priority; } private String name; private int priority; }
@Test public void PriorityQueueTest() { PriorityQueue<Task> pq = new PriorityQueue<Task>( new Comparator<Task>() { public int compare(Task t1, Task t2) { return t1.getPriority() - t2.getPriority(); } }); pq.add(new Task("task1", 20)); pq.add(new Task("task2", 10)); pq.add(new Task("task3", 30)); for (Task t : pq) System.out.println(t.getName() + "," + t.getPriority()); }
結果返回了task2,10;task1,20;task3,30。經過Task的priority屬性進行了排序。