如何在Java中使用Deque? - Java67

banq發表於2021-11-11

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。
 

相關文章