1. 程式人生 > 實用技巧 >Java 從入門到進階之路(二十六)

Java 從入門到進階之路(二十六)

在之前的文章我們介紹了一下 Java 中的 集合框架中的Collection 的子介面 List,本章我們來看一下 Java 集合框架中的Collection 的子介面 Queue。

在之前我們講 List 和 Set 的時候可以通過下標的形式獲取想要的元素,在 Collection 中其實還有 Queue 這個子介面,就是佇列的意思。

佇列可以形象的比喻為在火車站排隊買票,先進先出,後進後出,接下來我們就用程式碼來實現一下:

 import java.util.LinkedList;
import java.util.Queue; /**
* java.util.Queue
* 佇列
* 佇列也可以存放一組元素,但是存取元素必須
* 遵循:先進先出原則
*/ public class Main {
public static void main(String[] args) {
/**
* LinkedList 也實現了佇列介面,
* 因為它可以儲存一組元素
* 並且首尾增刪快,正好符合佇列的特點
*/
Queue<String> queue = new LinkedList<String>();
/**
* boolean offer(E e)
* 入隊操作,向隊尾追加一個新元素
*/
queue.offer("one");
queue.offer("two");
queue.offer("three");
queue.offer("four");
System.out.println(queue.size()); //
System.out.println(queue); // [one, two, three, four] /**
* E peek()
* 引用隊首元素,但是不做出隊操作
* 返回值是該元素
*/
String peek = queue.peek();
System.out.println(peek); // one
System.out.println(queue); // [one, two, three, four] /**
* E poll()
* 出隊操作,從隊首獲取元素,獲取後該元素
* 就從佇列中被刪除
* 返回值是該元素
*/
String old = queue.poll();
System.out.println(old); // one
System.out.println(queue); // [two, three, four] /**
* 迴圈獲取每個元素
* 不能通過 i++ 的形式,因為每次取出一個後 size 會有變化
*/
for (int i = queue.size(); i > 0; i--) {
System.out.println(queue.poll()); // two three four
}
// 用 while 更好點
while (queue.size() > 0) {
System.out.println(queue.poll()); // two three four
}
}
}

佇列在程式設計中一般不會用到,除非有特殊規定需要先後順序的時候採用,例如在玩遊戲伺服器爆滿要排隊進入遊戲的時候,當然得排除會員插隊現象。

下面我們再來看一下另一個概念:棧

棧:儲存醫囑元素,但是存取元素必須遵循先進後出的原則,通常為了實現後退這類功能會使用棧。

在現實生活中子彈上膛打出就是一個很經典的棧。

在上圖中是佇列的一些方法,如果我們把右邊的方法去掉不用,僅左邊的方法就是一個棧,先進後出。

在棧中還有自己的方法 push 和 pop,具體操作如下:

 import java.util.Deque;
import java.util.LinkedList; public class Main {
public static void main(String[] args) {
/**
* Java.util.Deque
* 雙端佇列,兩端都可以進出隊
* 當呼叫從一端進出佇列操作時,就形成了棧介面
* 因此,雙端佇列為棧提供了兩個方法
* push,pop
*/
Deque<String> stack = new LinkedList<String>();
stack.push("one");
stack.push("two");
stack.push("three");
stack.push("four");
System.out.println(stack.size()); //
System.out.println(stack); // [four, three, two, one] /**
* 獲取第一個元素
*/
String peek = stack.peek();
System.out.println(peek); // four
System.out.println(stack); // [four, three, two, one] /**
* 出棧操作
*/
String old = stack.pop();
System.out.println(old); // four
System.out.println(stack); // [three, two, one] /**
* 迴圈出棧
*/
while (stack.size() > 0) {
System.out.println(stack.pop()); // three two one
}
}
}

佇列和棧的區別在於一個先進先出,一個先進後出,很多方法都是通用的,需要自己在實際開發應用中使用。