日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java队列 Queue

發(fā)布時間:2024/9/30 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java队列 Queue 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/120828046
本文出自【趙彥軍的博客】

Java隊列 Queue
Java隊列 Deque
Java隊列 PriorityQueue
Java棧 Stack
Java阻塞隊列 LinkedBlockingDeque

文章目錄

  • Queue
  • 小結(jié)

Queue

隊列(Queue)是一種經(jīng)常使用的集合。Queue實際上是實現(xiàn)了一個先進先出(FIFO:First In First Out)的有序表。它和List的區(qū)別在于,List可以在任意位置添加和刪除元素,而Queue只有兩個操作:

  • 把元素添加到隊列末尾;
  • 從隊列頭部取出元素。

超市的收銀臺就是一個隊列:


在Java的標準庫中,隊列接口Queue定義了以下幾個方法:

  • int size():獲取隊列長度;
  • boolean add(E)/boolean offer(E):添加元素到隊尾;
  • E remove()/E poll():獲取隊首元素并從隊列中刪除;
  • E element()/E peek():獲取隊首元素但并不從隊列中刪除。

對于具體的實現(xiàn)類,有的Queue有最大隊列長度限制,有的Queue沒有。注意到添加、刪除和獲取隊列元素總是有兩個方法,這是因為在添加或獲取元素失敗時,這兩個方法的行為是不同的。我們用一個表格總結(jié)如下:

添加元素到隊尾返回false或null
添加元素到隊尾add(E e)boolean offer(E e)
取隊首元素并刪除E remove()E poll()
取隊首元素但不刪除E element()E peek()

舉個栗子,假設(shè)我們有一個隊列,對它做一個添加操作,如果調(diào)用 add()方法,當添加失敗時(可能超過了隊列的容量),它會拋出異常:

Queue<String> q = ... try {q.add("Apple");System.out.println("添加成功"); } catch(IllegalStateException e) {System.out.println("添加失敗"); }

如果我們調(diào)用 offer() 方法來添加元素,當添加失敗時,它不會拋異常,而是返回false:

Queue<String> q = ... if (q.offer("Apple")) {System.out.println("添加成功"); } else {System.out.println("添加失敗"); }

當我們需要從Queue中取出隊首元素時,如果當前Queue是一個空隊列,調(diào)用remove()方法,它會拋出異常:

Queue<String> q = ... try {String s = q.remove();System.out.println("獲取成功"); } catch(IllegalStateException e) {System.out.println("獲取失敗"); }

如果我們調(diào)用poll()方法來取出隊首元素,當獲取失敗時,它不會拋異常,而是返回null:

Queue<String> q = ... String s = q.poll(); if (s != null) {System.out.println("獲取成功"); } else {System.out.println("獲取失敗"); }

因此,兩套方法可以根據(jù)需要來選擇使用。

注意:不要把null添加到隊列中,否則poll()方法返回null時,很難確定是取到了null元素還是隊列為空。

接下來我們以poll()和peek()為例來說說“獲取并刪除”與“獲取但不刪除”的區(qū)別。對于Queue來說,每次調(diào)用poll(),都會獲取隊首元素,并且獲取到的元素已經(jīng)從隊列中被刪除了:

public class Main {public static void main(String[] args) {Queue<String> q = new LinkedList<>();// 添加3個元素到隊列:q.offer("apple");q.offer("pear");q.offer("banana");// 從隊列取出元素:System.out.println(q.poll()); // appleSystem.out.println(q.poll()); // pearSystem.out.println(q.poll()); // bananaSystem.out.println(q.poll()); // null,因為隊列是空的} }

如果用peek(),因為獲取隊首元素時,并不會從隊列中刪除這個元素,所以可以反復(fù)獲取:

public class Main {public static void main(String[] args) {Queue<String> q = new LinkedList<>();// 添加3個元素到隊列:q.offer("apple");q.offer("pear");q.offer("banana");// 隊首永遠都是apple,因為peek()不會刪除它:System.out.println(q.peek()); // appleSystem.out.println(q.peek()); // appleSystem.out.println(q.peek()); // apple} }

從上面的代碼中,我們還可以發(fā)現(xiàn),LinkedList即實現(xiàn)了List接口,又實現(xiàn)了Queue接口,但是,在使用的時候,如果我們把它當作List,就獲取List的引用,如果我們把它當作Queue,就獲取Queue的引用:

// 這是一個List: List<String> list = new LinkedList<>(); // 這是一個Queue: Queue<String> queue = new LinkedList<>();

始終按照面向抽象編程的原則編寫代碼,可以大大提高代碼的質(zhì)量。

小結(jié)

隊列Queue實現(xiàn)了一個先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu):

  • 通過add()/offer()方法將元素添加到隊尾;
  • 通過remove()/poll()從隊首獲取元素并刪除;
  • 通過element()/peek()從隊首獲取元素但不刪除。

要避免把null添加到隊列。

總結(jié)

以上是生活随笔為你收集整理的Java队列 Queue的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。