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