一、Deque簡介
Java Deque(雙端隊列)接口是Java集合框架中的一部分,用於在隊列的兩端插入和刪除元素。它是一個線性集合,支持元素的插入、刪除和檢查操作,可以用作棧和隊列的混合體。
Deque接口有兩個實現類:LinkedList和ArrayDeque。LinkedList底層是由雙向鏈表實現的,而ArrayDeque底層則是用數組實現的。兩者都實現了Deque接口,但是在某些情況下,這些實現可能會產生性能差異。
二、Deque的使用方法
Deque接口有豐富的API,可以滿足不同的需求。下面對Deque的使用方法進行介紹。
1. 添加元素
向Deque中添加元素可以用addFirst()、addLast()、offerFirst()和offerLast()四個方法。
Deque<String> deque = new LinkedList<>();
deque.addFirst("first"); //在隊列頭部添加元素
deque.addLast("last"); //在隊列尾部添加元素
deque.offerFirst("offer first"); //在隊列頭部添加元素
deque.offerLast("offer last"); //在隊列尾部添加元素
2. 獲取元素
從Deque中獲取元素可以使用getFirst()、getLast()、peekFirst()和peekLast()四個方法。
Deque<String> deque = new LinkedList<>();
deque.add("first");
deque.add("second");
deque.add("third");
String first = deque.getFirst(); //獲取隊列頭部的元素,如果隊列為空,則返回NoSuchElementException異常。
String last = deque.getLast(); //獲取隊列尾部的元素,如果隊列為空,則返回NoSuchElementException異常。
String peekFirst = deque.peekFirst(); //獲取隊列頭部的元素,如果隊列為空,則返回null。
String peekLast = deque.peekLast(); //獲取隊列尾部的元素,如果隊列為空,則返回null。
3. 刪除元素
從Deque中刪除元素可以使用removeFirst()、removeLast()、pollFirst()和pollLast()四個方法。
Deque<String> deque = new LinkedList<>();
deque.add("first");
deque.add("second");
deque.add("third");
String first = deque.removeFirst(); //刪除並返回隊列頭部的元素,如果隊列為空,則返回NoSuchElementException異常。
String last = deque.removeLast(); //刪除並返回隊列尾部的元素,如果隊列為空,則返回NoSuchElementException異常。
String pollFirst = deque.pollFirst(); //刪除並返回隊列頭部的元素,如果隊列為空,則返回null。
String pollLast = deque.pollLast(); //刪除並返回隊列尾部的元素,如果隊列為空,則返回null。
4. 檢查元素
檢查Deque中是否含有某個元素可以用contains()方法,獲取Deque中元素的個數可以用size()方法。
Deque<String> deque = new LinkedList<>();
deque.add("first");
deque.add("second");
deque.add("third");
boolean contains = deque.contains("first"); //檢查隊列中是否含有"first"元素
int size = deque.size(); //獲取隊列中元素的個數
三、LinkedList與ArrayDeque的性能比較
由於LinkedList和ArrayDeque在底層的實現方式不同,所以它們的性能表現也有所差異。下面通過代碼進行對比。
1. LinkedList性能測試
long startTime = System.currentTimeMillis();
Deque<Integer> deque = new LinkedList<>();
for (int i = 0; i < 1000000; i++) {
deque.addLast(i);
}
while (deque.size() > 0) {
deque.removeFirst();
}
long endTime = System.currentTimeMillis();
System.out.println("LinkedList time: " + (endTime - startTime) + "ms");
2. ArrayDeque性能測試
long startTime = System.currentTimeMillis();
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < 10000000; i++) {
deque.addLast(i);
}
while (deque.size() > 0) {
deque.removeFirst();
}
long endTime = System.currentTimeMillis();
System.out.println("ArrayDeque time: " + (endTime - startTime) + "ms");
由於性能測試結果會受到環境和代碼的影響,所以上面的代碼只是為了演示LinkedList和ArrayDeque的性能差異,並不代表實際情況。
至此,我們已經了解了Java Deque接口的實現及使用方法,可以在實際開發中根據需要選擇適合的實現類。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/157388.html