为什么使用Deque而不使用Stack构造栈
為什么使用Deque而不使用Stack構造棧
Class Stack<E>
-
java.lang.Object
-
- java.util.AbstractCollection<E>
-
- java.util.AbstractList<E>
-
- java.util.Vector<E>
-
- java.util.Stack<E>
-
-
實現的所有接口
Serializable?,?Cloneable?,?Iterable<E>?,?Collection<E>?,?List<E>?,?RandomAccess
public class Stack<E> extends Vector<E>Stack類表示后進先出(LIFO)對象堆棧。它通過五個操作擴展了類Vector?,允許將向量視為堆棧。提供了通常的push和pop操作,以及在堆棧頂部項目中的peek的方法,用于測試堆棧是否為empty的方法,以及用于項目的堆棧的方法以及發現它的距離search是從頂部。
首次創建堆棧時,它不包含任何項目。
Deque接口及其實現提供了更完整和一致的LIFO堆棧操作集,應優先使用此類。?例如:
Deque<Integer> stack = new ArrayDeque<Integer>(); -
繼承關系圖👇
由于Vector由于效率問題已經被棄用,因此繼承Vector的Stack也存在效率問題,故不推薦使用。
再一個原因是Deque雙端隊列可以實現多種數據結構,完全可以模擬成棧的結構。Deque上進上出,上進下出,甚至下進上出,非常上流,只有你想不到,沒有我Deque做不到的。
ArrayDeque與LinkList區別:
ArrayDeque:
- 數組結構
- 插入元素不能為null
- 無法確定數據量時,后期擴容會影響效率
LinkList:
- 鏈表結構
- 插入元素能為null
- 無法確定數據量時,有更好表現
Interface Deque<E>
-
參數類型
E?- 此雙端隊列中保留的元素類型
-
All Superinterfaces:
Collection<E>?,?Iterable<E>?,?Queue<E>
-
All Known Subinterfaces:
BlockingDeque<E>
-
所有已知實現類:
ArrayDeque?,?ConcurrentLinkedDeque?,?LinkedBlockingDeque?,?LinkedList
public interface Deque<E> extends Queue<E>
-
線性集合,支持兩端插入和移除元素。名稱deque是“雙端隊列”的縮寫,通常發音為“deck”。大多數Deque實現對它們可能包含的元素數量沒有固定限制,但此接口支持容量限制的deques以及沒有固定大小限制的deques。
-
此接口定義了訪問雙端隊列兩端元素的方法。 提供了插入,移除和檢查元素的方法。 這些方法中的每一種都以兩種形式存在:一種在操作失敗時拋出異常,另一種返回特殊值(?null或false?,具體取決于操作)。 后一種形式的插入操作專門設計用于容量限制的Deque實現; 在大多數實現中,插入操作不會失敗。
-
此接口擴展了Queue接口。 當deque用作隊列時,會產生FIFO(先進先出)行為。 元素在雙端隊列的末尾添加并從頭開始刪除。 繼承自Queue接口的方法與Deque方法完全等效,如下表所示:
Comparison of Queue and Deque methods?Queue?Method Equivalent?Deque?Method?add(e)?addLast(e)?offer(e)?offerLast(e)?remove()?removeFirst()?poll()?pollFirst()?element()?getFirst()?peek()?peekFirst()
-
Deques也可以用作LIFO(后進先出)堆棧。 應優先使用此接口,而不是舊版Stack?。 當deque用作堆棧時,元素將從雙端隊列的開頭推出并彈出。 堆棧方法相當于Deque方法,如下表所示:
Comparison of Stack and Deque methods Stack Method Equivalent?Deque?Method?push(e)?addFirst(e)?pop()?removeFirst()?peek()?getFirst()
-
請注意,當deque用作隊列或堆棧時,?peek方法同樣有效; 在任何一種情況下,元素都是從雙端隊列的開頭繪制的。
此界面提供了兩種刪除內部元素的方法,?removeFirstOccurrence和removeLastOccurrence?。
-
與List接口不同,此接口不支持對元素的索引訪問。
雖然嚴格要求Deque實現禁止插入null元素,但強烈建議他們這樣做。 任何用戶Deque強烈建議實現,也允許null元素不采取插入空的能力優勢。 這是因為null被各種方法用作特殊返回值,以指示deque為空。
Deque實現通常不定義equals和hashCode方法的基于元素的版本,而是繼承類Object基于身份的版本。
-
方法摘要
| boolean | add(E e) | 將指定的元素插入此雙端隊列表示的隊列中(換句話說,在此雙端隊列的尾部),如果它是立即可行且不會違反容量限制,返回?true成功時和拋出?IllegalStateException如果當前沒有空間可用的。 |
| boolean | addAll(Collection<? extends E> c) | 在此雙端隊列的末尾添加指定集合中的所有元素,就像通過在每個?對象上調用?addLast(E)一樣?,按照集合的迭代器返回它們的順序。 |
| void | addFirst(E e) | 如果可以在不違反容量限制的情況下立即插入指定元素,則在此雙端隊列的前面插入指定元素,如果當前沒有可用空間,則拋出?IllegalStateException?。 |
| void | addLast(E e) | 如果可以在不違反容量限制的情況下立即插入指定元素,則在此雙端隊列的末尾插入指定元素,如果當前沒有可用空間,則拋出?IllegalStateException?。 |
| boolean | contains(Object o) | 如果此雙端隊列包含指定的元素,則返回?true?。 |
| Iterator<E> | descendingIterator() | 以相反的順序返回此雙端隊列中元素的迭代器。 |
| E | element() | 檢索但不刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素)。 |
| E | getFirst() | 檢索但不刪除此雙端隊列的第一個元素。 |
| E | getLast() | 檢索但不刪除此雙端隊列的最后一個元素。 |
| Iterator<E> | iterator() | 以適當的順序返回此雙端隊列中元素的迭代器。 |
| boolean | offer(E e) | 將指定的元素插入此雙端隊列表示的隊列中(換句話說,在此雙端隊列的尾部),如果它是立即可行且不會違反容量限制,返回?true在成功和?false如果當前沒有空間可用。 |
| boolean | offerFirst(E e) | 將指定元素插入此雙端隊列的前面,除非它違反容量限制。 |
| boolean | offerLast(E e) | 在此雙端隊列的末尾插入指定的元素,除非它違反容量限制。 |
| E | peek() | 檢索但不移除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素),如果此雙端隊列為空,則返回?null?。 |
| E | peekFirst() | 檢索但不刪除此雙端隊列的第一個元素,如果此雙端隊列為空,則返回?null?。 |
| E | peekLast() | 檢索但不刪除此雙端隊列的最后一個元素,如果此雙端隊列為空,則返回?null?。 |
| E | poll() | 檢索并刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素),如果此雙端隊列為空,則返回?null?。 |
| E | pollFirst() | 檢索并刪除此雙端隊列的第一個元素,如果此雙端隊列為空,則返回?null?。 |
| E | pollLast() | 檢索并刪除此雙端隊列的最后一個元素,如果此雙端隊列為空,則返回?null?。 |
| E | pop() | 從此雙端隊列表示的堆棧中彈出一個元素。 |
| void | push(E e) | 如果可以在不違反容量限制的情況下立即執行此操作,?IllegalStateException到此雙端隊列表示的堆棧(換句話說,在此雙端隊列的頭部),如果當前沒有可用空間則拋出?IllegalStateException?。 |
| E | remove() | 檢索并刪除此雙端隊列表示的隊列的頭部(換句話說,此雙端隊列的第一個元素)。 |
| boolean | remove(Object o) | 從此雙端隊列中刪除第一次出現的指定元素。 |
| E | removeFirst() | 檢索并刪除此雙端隊列的第一個元素。 |
| boolean | removeFirstOccurrence(Object o) | 從此雙端隊列中刪除第一次出現的指定元素。 |
| E | removeLast() | 檢索并刪除此雙端隊列的最后一個元素。 |
| boolean | removeLastOccurrence(Object o) | 從此雙端隊列中刪除最后一次出現的指定元素。 |
| int | size() | 返回此雙端隊列中的元素數。 |
參考自https://www.cnblogs.com/code-duck/p/13569388.html?
總結
以上是生活随笔為你收集整理的为什么使用Deque而不使用Stack构造栈的全部內容,希望文章能夠幫你解決所遇到的問題。