在之前的文章我們介紹了一下 Java 中的 集合框架中的Collection 的子接口 List,本章我們來看一下 Java 集合框架中的Collection 的子接口 Queue。
在之前我們講 List 和 Set 的時候可以通過下標的形式獲取想要的元素,在 Collection 中其實還有 Queue 這個子接口,就是隊列的意思。
隊列可以形象的比喻為在火車站排隊買票,先進先出,后進后出,接下來我們就用代碼來實現一下:
1 import java.util.LinkedList; 2 import java.util.Queue; 3 4 /** 5 * java.util.Queue 6 * 隊列 7 * 隊列也可以存放一組元素,但是存取元素必須 8 * 遵循:先進先出原則 9 */ 10 11 public class Main { 12 public static void main(String[] args) { 13 /** 14 * LinkedList 也實現了隊列接口, 15 * 因為它可以保存一組元素 16 * 並且首尾增刪快,正好符合隊列的特點 17 */ 18 Queue<String> queue = new LinkedList<String>(); 19 /** 20 * boolean offer(E e) 21 * 入隊操作,向隊尾追加一個新元素 22 */ 23 queue.offer("one"); 24 queue.offer("two"); 25 queue.offer("three"); 26 queue.offer("four"); 27 System.out.println(queue.size()); // 4 28 System.out.println(queue); // [one, two, three, four] 29 30 /** 31 * E peek() 32 * 引用隊首元素,但是不做出隊操作 33 * 返回值是該元素 34 */ 35 String peek = queue.peek(); 36 System.out.println(peek); // one 37 System.out.println(queue); // [one, two, three, four] 38 39 /** 40 * E poll() 41 * 出隊操作,從隊首獲取元素,獲取后該元素 42 * 就從隊列中被刪除 43 * 返回值是該元素 44 */ 45 String old = queue.poll(); 46 System.out.println(old); // one 47 System.out.println(queue); // [two, three, four] 48 49 /** 50 * 循環獲取每個元素 51 * 不能通過 i++ 的形式,因為每次取出一個后 size 會有變化 52 */ 53 for (int i = queue.size(); i > 0; i--) { 54 System.out.println(queue.poll()); // two three four 55 } 56 // 用 while 更好點 57 while (queue.size() > 0) { 58 System.out.println(queue.poll()); // two three four 59 } 60 } 61 }
隊列在編程中一般不會用到,除非有特殊規定需要先后順序的時候采用,例如在玩游戲服務器爆滿要排隊進入游戲的時候,當然得排除會員插隊現象。
下面我們再來看一下另一個概念:棧
棧:存儲一組元素,但是存取元素必須遵循先進后出的原則,通常為了實現后退這類功能會使用棧。
在現實生活中子彈上膛打出就是一個很經典的棧。
在上圖中是隊列的一些方法,如果我們把右邊的方法去掉不用,僅左邊的方法就是一個棧,先進后出。
在棧中還有自己的方法 push 和 pop,具體操作如下:
1 import java.util.Deque; 2 import java.util.LinkedList; 3 4 public class Main { 5 public static void main(String[] args) { 6 /** 7 * Java.util.Deque 8 * 雙端隊列,兩端都可以進出隊 9 * 當調用從一端進出隊列操作時,就形成了棧接口 10 * 因此,雙端隊列為棧提供了兩個方法 11 * push,pop 12 */ 13 Deque<String> stack = new LinkedList<String>(); 14 stack.push("one"); 15 stack.push("two"); 16 stack.push("three"); 17 stack.push("four"); 18 System.out.println(stack.size()); // 4 19 System.out.println(stack); // [four, three, two, one] 20 21 /** 22 * 獲取第一個元素 23 */ 24 String peek = stack.peek(); 25 System.out.println(peek); // four 26 System.out.println(stack); // [four, three, two, one] 27 28 /** 29 * 出棧操作 30 */ 31 String old = stack.pop(); 32 System.out.println(old); // four 33 System.out.println(stack); // [three, two, one] 34 35 /** 36 * 循環出棧 37 */ 38 while (stack.size() > 0) { 39 System.out.println(stack.pop()); // three two one 40 } 41 } 42 }
隊列和棧的區別在於一個先進先出,一個先進后出,很多方法都是通用的,需要自己在實際開發應用中使用。