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