在本教程中,我們將借助示例來學習ArrayDeque類及其方法。此外,我們還將學習使用ArrayDeque來實現(xiàn)堆棧。
在Java中,我們可以使用ArrayDeque該類使用數(shù)組來實現(xiàn)隊列和雙端隊列數(shù)據(jù)結構。
在ArrayDeque類實現(xiàn)這兩個接口:

為了創(chuàng)建ArrayDeque雙端隊列,我們必須導入java.util.ArrayDeque包。
這是我們可以用Java創(chuàng)建ArrayDeque雙端隊列的方法:
ArrayDeque<Type> animal = new ArrayDeque<>();
在此,Type表示ArrayDeque雙端隊列的類型。例如,
//創(chuàng)建字符串類型ArrayDeque ArrayDeque<String> animals = new ArrayDeque<>(); //創(chuàng)建整數(shù)類型ArrayDeque ArrayDeque<Integer> age = new ArrayDeque<>();
ArrayDeque類提供了所有的存在于方法Queue和Deque接口。
1.使用add(),addFirst()和addLast()添加元素
add() - 將指定的元素插入ArrayDeque雙端隊列的末尾
addFirst() -在ArrayDeque雙端隊列的開頭,插入指定的元素
addLast() - 在ArrayDeque雙端隊列的末尾插入指定的內容(等效于add())
注意:如果ArrayDeque雙端隊列已滿,則所有這些方法add(),addFirst()和addLast()都會引發(fā)IllegalStateException。
例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
//使用add ()
animals.add("Dog");
//使用addFirst ()
animals.addFirst("Cat");
//使用addLast()
animals.addLast("Horse");
System.out.println("ArrayDeque: " + animals);
}
}輸出結果
ArrayDeque: [Cat, Dog, Horse]
2.使用 offer(),offerFirst()和offerLast()插入元素
offer() - 將指定的元素插入ArrayDeque雙端隊列的末尾
offerFirst() - 在ArrayDeque雙端隊列的開始處插入指定的元素
offerLast() - 將指定的元素插入ArrayDeque雙端隊列的末尾
注意: offer(),offerFirst()并offerLast()返回true是否成功插入元素;否則,返回。如果ArrayDeque雙端隊列已滿,則這些方法返回false。
例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
//使用offer()
animals.offer("Dog");
//使用offerFirst()
animals.offerFirst("Cat");
//使用offerLast()
animals.offerLast("Horse");
System.out.println("ArrayDeque: " + animals);
}
}輸出結果
ArrayDeque: [Cat, Dog, Horse]
1.使用getFirst()和getLast()訪問元素
getFirst() - 返回ArrayDeque雙端隊列的第一個元素
getLast() - 返回ArrayDeque雙端隊列的最后一個元素
注:如果ArrayDeque雙端隊列為空,getFirst()和getLast()拋出NoSuchElementException。
例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
// 獲取第一個元素
String firstElement = animals.getFirst();
System.out.println("第一個元素: " + firstElement);
//獲取最后一個元素
String lastElement = animals.getLast();
System.out.println("最后一個元素: " + lastElement);
}
}輸出結果
ArrayDeque: [Dog, Cat, Horse] 第一個元素: Dog 最后一個元素: Horse
2.使用peek(),peekFirst()和peekLast()方法訪問元素
peek() - 返回ArrayDeque雙端隊列的第一個元素
peekFirst() - 返回ArrayDeque雙端隊列的第一個元素(等效于peek())
peekLast() - 返回ArrayDeque雙端隊列的最后一個元素
例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
//使用peek()
String element = animals.peek();
System.out.println("頭元素: " + element);
//使用peekFirst()
String firstElement = animals.peekFirst();
System.out.println("第一個元素: " + firstElement);
//使用peekLast
String lastElement = animals.peekLast();
System.out.println("最后一個元素: " + lastElement);
}
}輸出結果
ArrayDeque: [Dog, Cat, Horse] Head Element: Dog 第一個元素: Dog 最后一個元素: Horse
注意:如果ArrayDeque雙端隊列為空,peek(),peekFirst()和getLast()拋出NoSuchElementException。
1.使用remove(),removeFirst(),removeLast()方法刪除元素
remove() - 返回并從ArrayDeque雙端隊列的第一個元素中刪除一個元素
remove(element) - 返回并從ArrayDeque雙端隊列的頭部刪除指定的元素
removeFirst() - 返回并從ArrayDeque雙端隊列中刪除第一個元素(等效于remove())
removeLast() - 返回并從ArrayDeque雙端隊列中刪除最后一個元素
注意:如果數(shù)組雙端隊列為空,則remove(),removeFirst()和removeLast()方法將引發(fā)異常。 另外,如果找不到元素,則remove(element)會引發(fā)異常。
例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
//使用remove()
String element = animals.remove();
System.out.println("刪除Element: " + element);
System.out.println("新的ArrayDeque: " + animals);
//使用removeFirst()
String firstElement = animals.removeFirst();
System.out.println("刪除第一個元素: " + firstElement);
//使用removeLast()
String lastElement = animals.removeLast();
System.out.println("刪除最后一個元素: " + lastElement);
}
}輸出結果
ArrayDeque: [Dog, Cat, Cow, Horse] 刪除Element: Dog 新的ArrayDeque: [Cat, Cow, Horse] 刪除第一個元素: Cat 刪除最后一個元素: Horse
2.使用poll(),pollFirst()和pollLast()方法刪除元素
poll() - 返回并刪除ArrayDeque雙端隊列的第一個元素
pollFirst() - 返回并刪除ArrayDeque雙端隊列的第一個元素(等效于poll())
pollLast() - 返回并刪除ArrayDeque雙端隊列的最后一個元素
注意:如果ArrayDeque雙端隊列為空,則如果找不到該元素,則poll(),pollFirst()和pollLast()返回null。
例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
//使用poll()
String element = animals.poll();
System.out.println("刪除Element: " + element);
System.out.println("新的ArrayDeque: " + animals);
//使用pollFirst()
String firstElement = animals.pollFirst();
System.out.println("刪除第一個元素: " + firstElement);
//使用pollLast()
String lastElement = animals.pollLast();
System.out.println("刪除最后一個元素: " + lastElement);
}
}輸出結果
ArrayDeque: [Dog, Cat, Cow, Horse] 刪除Element: Dog 新的ArrayDeque: [Cat, Cow, Horse] 刪除第一個元素: Cat 刪除最后一個元素: Horse
3.刪除元素:使用clear()方法
要從ArrayDeque雙端隊列中刪除所有元素,我們使用clear()方法。例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayDeque: " + animals);
//使用clear()
animals.clear();
System.out.println("新的ArrayDeque: " + animals);
}
}輸出結果
ArrayDeque: [Dog, Cat, Horse] 新的ArrayDeque: []
iterator() - 返回可用于遍歷ArrayDeque雙端隊列的迭代器
descendingIterator() -返回一個迭代器,該迭代器可用于以相反順序遍歷ArrayDeque雙端隊列
為了使用這些方法,我們必須導入java.util.Iterator包。例如,
import java.util.ArrayDeque;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
ArrayDeque<String> animals= new ArrayDeque<>();
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.print("ArrayDeque: ");
//使用iterator()
Iterator<String> iterate = animals.iterator();
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
System.out.print("\n反向ArrayDeque: ");
//使用descendingIterator()
Iterator<String> desIterate = animals.descendingIterator();
while(desIterate.hasNext()) {
System.out.print(desIterate.next());
System.out.print(", ");
}
}
}輸出結果
ArrayDeque: [Dog, Cat, Horse] 反向ArrayDeque: [Horse, Cat, Dog]
| 方法 | 內容描述 |
|---|---|
| element() | 從ArrayDeque雙端隊列的頭部返回一個元素。 |
| contains(element) | 在ArrayDeque雙端隊列中搜索指定的元素。 如果找到該元素,則返回true,否則返回false。 |
| size() | 返回ArrayDeque雙端隊列的長度。 |
| toArray() | 將ArrayDeque雙端隊列轉換為數(shù)組并返回。 |
| clone() | 創(chuàng)建ArrayDeque雙端隊列的副本并返回它。 |
要在Java中實現(xiàn)LIFO(后進先出)堆棧,建議在Stack類上使用雙端隊列。該ArrayDeque類比Stack類快。
ArrayDeque 提供了以下可用于實現(xiàn)堆棧的方法。
push() - 在堆棧頂部添加一個元素
peek() - 從堆棧頂部返回一個元素
pop() - 返回并從堆棧頂部刪除元素
例如,
import java.util.ArrayDeque;
class Main {
public static void main(String[] args) {
ArrayDeque<String> stack = new ArrayDeque<>();
//將元素添加到stack
stack.push("Dog");
stack.push("Cat");
stack.push("Horse");
System.out.println("Stack: " + stack);
//從堆棧頂部訪問元素
String element = stack.peek();
System.out.println("訪問元素: " + element);
//從堆棧頂部刪除元素
String remElement = stack.pop();
System.out.println("刪除element: " + remElement);
}
}輸出結果
Stack: [Horse, Cat, Dog] 訪問元素: Horse 刪除Element: Horse
ArrayDeque和Java的LinkedList都實現(xiàn)了Deque接口。但是,它們之間存在一些差異。
LinkedList支持空元素,而ArrayDeque不支持。
鏈表中的每個節(jié)點都包含到其他節(jié)點的鏈接。這就是LinkedList比ArrayDeque需要更多存儲空間的原因。
如果要實現(xiàn)隊列或雙端隊列數(shù)據(jù)結構,則ArrayDeque可能比LinkedList快。