Java集合 之 隊列Queue集合

来源:http://www.cnblogs.com/shouce/archive/2016/04/25/5429269.html
-Advertisement-
Play Games

什麼是Queue集合? 答:Queue用於模擬隊列這種數據結構。隊列通常是指“先進先出(FIFO)”的容器。隊列的頭部保存在隊列中存放時間最長的元素,尾部保存存放時間最短的元素。新元素插入到隊列的尾部,取出元素會返回隊列頭部的元素。通常,隊列不允許隨機訪問隊列中的元素。 Queue介面中定義瞭如下的 ...


什麼是Queue集合?

答:Queue用於模擬隊列這種數據結構。隊列通常是指“先進先出(FIFO)”的容器。隊列的頭部保存在隊列中存放時間最長的元素,尾部保存存放時間最短的元素。新元素插入到隊列的尾部,取出元素會返回隊列頭部的元素。通常,隊列不允許隨機訪問隊列中的元素。

Queue介面中定義瞭如下的幾個方法:

void add(Object e):  將指定元素插入到隊列的尾部。

object element():  獲取隊列頭部的元素,但是不刪除該元素。

boolean offer(Object e):  將指定的元素插入此隊列的尾部。當使用容量有限的隊列時,此方法通常比add(Object e)有效。 

Object peek():  返回隊列頭部的元素,但是不刪除該元素。如果隊列為空,則返回null。

Object poll():  返回隊列頭部的元素,並刪除該元素。如果隊列為空,則返回null。

Object remove():  獲取隊列頭部的元素,並刪除該元素。

Queue介面有一個PriorityQueue實現類。除此之外,Queue還有一個Deque介面,Deque代表一個“雙端隊列”,雙端隊列可以同時從兩端刪除或添加元素,因此Deque可以當作棧來使用。java為Deque提供了ArrayDeque實現類和LinkedList實現類。

1.PriorityQueue實現類

PriorityQueue是一種比較標準的隊列實現類,而不是絕對標準的。這是因為PriorityQueue保存隊列元素的順序不是按照元素添加的順序來保存的,而是在添加元素的時候對元素的大小排序後再保存的。因此在PriorityQueue中使用peek()或pool()取出隊列中頭部的元素,取出的不是最先添加的元素,而是最小的元素。

複製代碼
public class PriorityQueueTest {
    public static void main(String[] args){
        PriorityQueue pq = new PriorityQueue();
        pq.offer(6);
        pq.add(-3);
        pq.add(20);
        pq.offer(18);
        //輸出:[-3, 6, 20, 18]
        System.out.println(pq);
    }
}
複製代碼

PriorityQueue不允許插入null元素,它還需要對隊列元素進行排序,PriorityQueue有兩種排序方式:

自然排序:採用自然排序的PriorityQueue集合中的元素必須實現Comparator介面,而且應該是一個類的多個實例,否則可能導致ClassCastException異常。

定製排序:創建PriorityQueue隊列時,傳入一個Comparable對象,該對象負責對所有隊列中的所有元素進行排序。採用定製排序不要求必須實現Comparator介面。

2.Dueue介面與ArrayDeque實現類

 Deque介面是Queue介面的子介面,它代表一個雙端隊列,Deque定義了一些方法:

void addFirst(Object e):   將指定元素添加到雙端隊列的頭部。

void addLast(Object e):  將指定元素添加到雙端隊列的尾部。

Iteratord descendingItrator():  返回該雙端隊列對應的迭代器,該迭代器以逆向順序來迭代隊列中的元素。

Object getFirst():  獲取但不刪除雙端隊列的第一個元素。

Object getLast():  獲取但不刪除雙端隊列的最後一個元素。

boolean offFirst(Object e):  將指定元素添加到雙端隊列的頭部。

boolean offLast(OBject e):  將指定元素添加到雙端隊列的尾部。

Object peekFirst():  獲取但不刪除雙端隊列的第一個元素;如果雙端隊列為空,則返回null。

Object PeekLast():  獲取但不刪除雙端隊列的最後一個元素;如果雙端隊列為空,則返回null。

Object pollFirst():  獲取並刪除雙端隊列的第一個元素;如果雙端隊列為空,則返回null。

Object pollLast():  獲取並刪除雙端隊列的最後一個元素;如果雙端隊列為空,則返回null。

Object pop()(棧方法):  pop出該雙端隊列所表示的棧的棧頂元素。相當於removeFirst()。

void push(Object e)(棧方法):  將一個元素push進該雙端隊列所表示的棧的棧頂。相當於addFirst()。

Object removeFirst():  獲取並刪除該雙端隊列的第一個元素。

Object removeFirstOccurence(Object o):  刪除該雙端隊列的第一次出現的元素o。

Object removeLast():  獲取並刪除該雙端隊列的最後一個元素o。

Object removeLastOccurence(Object o):  刪除該雙端隊列的最後一次出現的元素o。

複製代碼
public class ArrayDequeTest {
    public static void main(String[] args){
        ArrayDeque queue = new ArrayDeque();
        queue.offer("春");
        queue.offer("夏");
        queue.offer("秋");
        //輸出:[春, 夏, 秋]
        System.out.println(queue);
        //輸出:春
        System.out.println(queue.peek());
        //輸出:[春, 夏, 秋]
        System.out.println(queue);
        //輸出:春
        System.out.println(queue.poll());
        //輸出:[夏, 秋]
        System.out.println(queue);
        
    }
}
複製代碼 複製代碼
//將雙端隊列當做棧
public class DequeStack {
    public static void main(String[] args){
        ArrayDeque stack = new ArrayDeque();
        stack.push("春");
        stack.push("夏");
        stack.push("秋");
        //輸出:[秋, 夏, 春]
        System.out.println(stack);
        //輸出:秋
        System.out.println(stack.peek());
        //輸出:[秋, 夏, 春]
        System.out.println(stack);
        //輸出:秋
        System.out.println(stack.pop());
        //輸出:[夏, 春]
        System.out.println(stack);
    }
}
複製代碼

3.LinkedList實現類

LinkedList是List介面的實現類,因此它可以是一個集合,可以根據索引來隨機訪問集合中的元素。此外,它還是Duque介面的實現類,因此也可以作為一個雙端隊列,或者棧來使用。

LinkedList與ArrayList,ArrayDeque的實現機制完全不同,ArrayList和ArrayDeque內部以數組的形式來保存集合中的元素,因此隨機訪問集合元素時有較好的性能;而LinkedList以鏈表的形式來保存集合中的元素,因此隨機訪問集合元素時性能較差,但是插入和刪除元素時性能比較出色(只需改變指針所指的地址即可),需要指出的是,雖然Vector也是以數組的形式來存儲集合但因為它實現了線程同步(而且實現的機制不好),故各方面的性能都比較差。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 亂碼 上節說到亂碼出現的主要原因,即在進行編碼轉換的時候,如果將原來的編碼識別錯了,併進行了轉換,就會發生亂碼,而且這時候無論怎麼切換查看編碼的方式,都是不行的。 我們來看一個這種錯誤轉換後的亂碼,還是用上節的例子,二進位是(16進位表示):C3 80 C3 8F C3 82 C3 AD,無論按哪種 ...
  • 在騷擾了PayPal的技術支持好幾天之後終於成功對接了PayPal支付,非常感謝PayPal的技術支持人員,沒有她估計一周都搞不定。記錄一下這個過程。 接到這個任務聯繫了PayPal的技術之後,第一件事就是向她要了一些文檔。PayPal提供了一個demo商店https://demo.paypal.c ...
  • 前言:當我們進行大的項目書寫的時候或者我們選擇維護程式的時候,想知道幾點幾時我們錄入的數據有bug是那麼我們就採用 》log4j記錄日誌的信息 一、日誌及其分類 1、軟體運行的過程中離不開日誌。日誌主要用來記錄系統運行過程中的一些重要操作信息,便於監視系統運行的情況,幫助用戶避免和發現可能出現的問題 ...
  • 1、接收用戶輸入: input:接收用戶輸入的是合法的python表達式,比如字元串。 raw_input:把所有的輸入當做原始數據(raw data)。 除非對input有特別的需要,否則儘可能使用raw_input函數。 2、長字元串和原始字元串 長字元串常利用'\'經行轉義,例如: 這句話會打 ...
  • 原文地址:http://blog.csdn.net/morewindows/article/details/7421759 使用多線程其實是非常容易的,下麵這個程式的主線程會創建了一個子線程並等待其運行完畢,子線程就輸出它的線程ID號然後輸出一句經典名言——Hello World。整個程式的代碼非常 ...
  • 概述 Java語言中,提供了一套數據集合框架,其中定義了一些諸如List、Set等抽象數據類型,每個抽象數據類型的各個具體實現,底層又採用了不同的實現方式,比如ArrayList和LinkedList。 除此之外,Java對於數據集合的遍歷,也提供了幾種不同的方式。開發人員必須要清楚的明白每一種遍歷 ...
  • 程式中需USE COMOBJ單元 1.Q:如何得到機器上IIS中所有的WEB虛擬站點. A: var InstallPath: String; WebSite, WebServer, WebRoot: Variant; count: Integer; Flag: Boolean; begin Fla ...
  • 本文目的 PHP的全局錯誤處理,在開發項目的時候很有用,可以幫助開發者快速定位一些問題,提高工作效率。預設情況下,全局錯誤會直接輸出,但是最近開發時使用的一個框架庫對全局錯誤處理進行了設定,導致很多錯誤信息沒有輸出,在定位問題上有一定的耗時。所以,研究了一下此庫的實現,發現它設定了error_rep ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...