java 队列和堆栈_Java中的堆栈和队列
java 隊列和堆棧
我最近一直在研究一些需要堆棧和隊列的Java代碼。 使用的選擇不是立即顯而易見的。 有一個Queue接口,但沒有明確的具體實現(xiàn)要使用。 還有一個Stack類,但是javadocs指出其他類“應該優(yōu)先于此類使用”。 那么,您對Java中的堆棧和隊列使用哪種實現(xiàn)?
我發(fā)現(xiàn)我的經驗法則是可以將ArrayDeque類同時用于Stack和Queues,但下面提供了更多詳細信息。
通用定義
首先,讓我們從一些定義開始。 在該詞的常用用法中,隊列是FIFO(先進先出)。 就像在郵局排隊的第一個人一樣。 堆棧為LIFO(后進先出)。 想象一堆書–您放在書堆中的最后一本書是您摘下的第一本書。
Java中的選擇
在Java中,情況稍微復雜一些,但原理相同。 有前面提到的Queue接口,該接口具有添加,刪除和查看元素的預期方法。 (實際上,這些方法有兩種形式:一種在操作失敗時引發(fā)異常,另一種返回特殊值,例如null或false;請參見此處 )。
還有一個名為Deque的Queue子接口,它是“雙頭隊列”的縮寫,通常發(fā)音為“ deck”。 該接口定義訪問集合兩端的元素的方法。 此功能使Deque成為隊列和堆棧實現(xiàn)的有用基礎。
但是,Queue和Deque都是接口,因此我們仍然沒有找到要使用的具體實現(xiàn)…
候選清單:ArrayDeque和LinkedList
2個主要選擇是: ArrayDeque和LinkedList 。 Deque還有其他一些實現(xiàn),例如ConcurrentLinkedDeque和LinkedBlockingDeque,以及大量的Queue實現(xiàn),例如DelayQueue,LinkedBlockingDeque和PriorityQueue。 由于這些功能較為專業(yè)(而且我使用的并不多),因此我不再贅述。
ArrayDeque
從javadocs開始 ,ArrayDeque是Deque接口的可調整大小的數(shù)組實現(xiàn)。 除remove *,contains *和bulk操作外,大多數(shù)ArrayDeque操作均以攤銷的固定時間運行(即“偶爾”,但平均為常數(shù)),所有操作均以線性時間運行。 文檔指出,此類用作堆棧時,可能比Stack快,而用作隊列時,則比LinkedList快。 這條語句使我使用ArrayDeque作為堆棧和隊列的默認實現(xiàn)。
鏈表
LinkedList類實現(xiàn)List,Queue和Deque接口。 除了實現(xiàn)List接口之外,LinkedList類還提供統(tǒng)一命名的方法,以獲取,刪除和在列表的開頭和結尾插入元素。 這些操作允許將鏈接列表用作堆棧,隊列或雙端隊列。
LinkedList與ArrayDeque
因此,何時使用ArrayDeque上的LinkedList?
LinkedList實現(xiàn)的優(yōu)點是:
- 比ArrayDeque實現(xiàn)更靈活,因為它
- 實現(xiàn)所有可選的列表操作。
- 非常適合需要頻繁刪除/插入列表中間的項目(某些情況可能會導致ArrayDeque的大型數(shù)組副本)。
LinkedList實現(xiàn)的缺點:
- 一般而言,在迭代項目時并不理想
- 比ArrayDeque實現(xiàn)消耗更多的內存
總體
在效率方面,ArrayDeque比LinkedList在兩端進行迭代和添加/刪除操作效率更高。 因此,正如javadocs所指出的那樣,通常,在用作堆棧時,ArrayDeque可能比堆棧快,而當用作隊列時,則比LinkedList快。
翻譯自: https://www.javacodegeeks.com/2013/10/stacks-and-queues-in-java.html
java 隊列和堆棧
總結
以上是生活随笔為你收集整理的java 队列和堆栈_Java中的堆栈和队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仅上线 7 个月,消息称 EA 将放弃对
- 下一篇: javafx 加载_JavaFX 2:如