如何在Java中使用Deque? - Java67
Queue 和 Deque的區別在於 ,您只能從 Queue 的後端新增元素,但可以在 Deque 的前端和後端新增元素。
考慮你想實現一個售票櫃檯。人們可以從最後進入佇列,並將從前面移除。而且,為了實現這個場景,我們將使用的資料結構將是 Queue 資料結構,對嗎?很容易吧?等等,現在讓我們再觀察一個場景。
你進入佇列並買票。買完票就走人了。但是,您發現票上印的名字有出入還為時不晚。(一個經典的售票櫃檯錯誤!)
現在,你會怎麼做?已經買好票了,不用再排隊了,對吧?您將直接前往售票櫃檯並檢查是否存在差異。但是你們有沒有透過這個場景觀察到什麼?花 2 分鐘時間思考一些與佇列相關的事情。如果你們觀察到,你是第二次從前面進入佇列!但是佇列中不支援該操作,對嗎?所以,基本上, 我們需要一個 Queue 不僅可以從後面插入,還可以從前面插入。
這就是Deque概念的 由來!眾所周知,佇列可以使用連結串列來實現。
一個deque的是一個雙端佇列,我們可以從兩端新增,更新或刪除元素。佇列可以使用連結串列來實現,其中首先插入的元素首先被刪除(FIFO)。
單向連結串列可用於實現無界佇列,雙連結串列可用於實現雙端佇列。
以下是 Java 中 Dequeue 資料結構的一些重要方法:
- insertFront() :在雙端佇列的前面新增一個專案
- insertLast() : 在雙端佇列的末尾新增一個專案
- deleteFront() : 從 deque 的前面刪除一個專案
- deleteLast() : 從雙端佇列的末尾刪除一個專案
- getFront() : 從 deque 獲取前面的元素
- getRear() : 從雙端佇列中獲取後/最後一項
這是我們完整的 Java 程式,用於演示如何在 Java 中使用 Deque 集合類。在這個程式中,我們使用了 ArrayDeque 作為 Deque 的實現。請記住,Dequeue 允許您在兩端插入和刪除物件,這就是本示例中顯示的內容。
您可以使用addFirst()方法在第一個或前面 新增元素,並使用add()方法在後端新增元素 。同樣,您可以使用Java 中的removeFirst()方法從前端刪除元素 。
import java.util.ArrayDeque; import java.util.Deque; public class DequeDemo extends Thread{ public static Deque<Integer> deque; public static void main(String[] args) throws InterruptedException { deque = new ArrayDeque<>(); //add at last deque.add(1); //deque : 1 //add at first deque.addFirst(3); //deque : 3 -> 1 //add at last deque.addLast(2); //deque: 3 -> 1 -> 2 //add at last deque.add(4); //deque : 3 -> 1 -> 2 -> 4 //remove at first deque.removeFirst(); //deque : 1 -> 2 -> 4 deque.forEach(a -> System.out.print(a+"->")); System.out.println(); } } |
Java 中 Deque 的侷限性
在考慮多執行緒環境時,Deque 有一些限制。考慮一個場景。考慮 3 個執行緒同時處理一個 Deque,並且兩個執行緒都想在第 4 個索引處新增一個元素。
考慮一個 Deque,其中執行緒 A 和執行緒 B 都試圖將一個元素放在第 4 個位置。執行緒 A 想要插入值 7,執行緒 B 想要插入值 9。無論哪個執行緒首先訪問雙端佇列都會放置一個值。假設執行緒 B 首先放置一個值 9,然後執行緒 A 來並將該值更改為 7。現在,執行緒 A 知道該值是 7,但執行緒 B 仍然認為該值是 9。這是一個經典案例由於多執行緒期間缺乏安全性,這些值會丟失。
當您實際嘗試使用 Deque 編寫此場景 時,當您嘗試從多個執行緒同時修改 Deque 時,java 將丟擲 ConcurrentModificationException。
相關文章
- deque
- Java 容器原始碼分析之 Deque 與 ArrayDequeJava原始碼
- 如何在 Java 中使用 MQTTJavaMQQT
- 如何在java中呼叫js方法JavaJS
- 如何在Java中使用同步 -ManushaJava
- 如何在Java中做基準測試?JMH使用初體驗Java
- STL-queue&deque&stack
- C++ STL deque容器C++
- 如何在JAVA中通^OLEDBB接ACCESS?Java
- 如何在Java中使用泛型 -ManushaJava泛型
- 如何在java類中呼叫websphere中的jndi物件JavaWeb物件
- 如何在Java中判斷是否為空Java
- 如何在 Java 中實現無向圖Java
- 如何在 Java 中進行圖片剪裁Java
- 為何在查詢中索引未被使用索引
- 教你如何在 Ubuntu 中安裝 Oracle Java 13UbuntuOracleJava
- 如何在Java中將double轉換為int?Java
- 如何在Java中反轉單連結串列?Java
- 如何在Java中將字串轉換為日期Java字串
- [轉載] Java中如何在方法中return返回多個值Java
- 如何在Windows 11系統中將任意檔案(如bat/log等)固定在開始選單?WindowsBAT
- 如何在 JavaScript 中更好地使用陣列JavaScript陣列
- 如何在 Blazor WebAssembly中 使用 功能開關BlazorWeb
- 如何在 Rails 中搭配 Turbolinks 使用 VueAIVue
- 如何在Java 8中將List轉換為Map?Java
- 聊聊如何在Java應用中傳送簡訊Java
- 4.10 如何在Java中進行排序開發Java排序
- python deque的兩大優點Python
- 《STL原始碼剖析》-- stl_deque.h原始碼
- 如何在Python中使用Java類? - codecentricPythonJava
- 如何在 Java 中正確使用 wait, notify 和 notifyAllJavaAI
- 如何在 Laravel 中靈活的使用 TraitLaravelAI
- 如何在 Vue 中優雅地使用 CSS Modules?VueCSS
- 如何在 React 中優雅的使用 addEventListenerReactdev
- reCAPTCHA是Google使用方式如下如所示APTGo
- 如何在Java中使用檔案操作API: java.nio.file.Path?- marcobehlerJavaAPI
- 如何在 Java 中實現二叉搜尋樹Java
- 如何在Java中返回樹形結構 最佳實踐Java