日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java集合—Deque Stack

發(fā)布時間:2024/4/15 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java集合—Deque Stack 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文作者:驚帆的BLOG

原文地址:Java中的Deque和Stack的內(nèi)部原理區(qū)別

關(guān)于Deque 和 Stack,如果沒有對API有很仔細(xì)的研究,單純從使用上來說,很難仔細(xì)發(fā)現(xiàn)他們中間的區(qū)別,雖然他們有很大不同。而實(shí)際在Java Doc里是建議用Deque替代Stack接口完成棧的功能,我們仔細(xì)看下Java Doc里對Stack是這樣描述的:

A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For example:Deque<Integer> stack = new ArrayDeque<Integer>();

而對Deque是這樣描述的:

Deques can also be used as LIFO (Last-In-First-Out) stacks. This interface should be used in preference to the legacy Stack class. When a deque is used as a stack, elements are pushed and popped from the beginning of the deque.

也就是讓我們不要再使用Stack接口去完成棧的功能,而是使用Deque,并且提供了相關(guān)例子。那么為什么會這樣建議呢?首先,我們可以發(fā)現(xiàn)Deque是繼承自Queue,而Stack是繼承自Vector,這就比較奇怪了。Vector是由數(shù)組實(shí)現(xiàn)的集合類,他包含了大量集合處理的方法。而Stack之所以繼承Vector,是為了復(fù)用Vector中的方法,來實(shí)現(xiàn)進(jìn)棧(push)、出棧(pop)等操作。這里就是Stack設(shè)計不好的地方,既然只是為了實(shí)現(xiàn)棧,不用鏈表來單獨(dú)實(shí)現(xiàn),而是為了復(fù)用簡單的方法而迫使它繼承Vector,Stack和Vector本來是毫無關(guān)系的。這使得Stack在基于數(shù)組實(shí)現(xiàn)上效率受影響,另外因?yàn)槔^承Vector類,Stack可以復(fù)用Vector大量方法,這使得Stack在設(shè)計上不嚴(yán)謹(jǐn),例如Vector中的:

public void add(int index, E element) {insertElementAt(element, index); }

可以在指定位置添加元素,這與Stack 的設(shè)計理念相沖突(棧只能在棧頂添加或刪除元素)。所以Java后來修正了這個不良好的設(shè)計,提出了用Deque代替Stack的建議。

Deuqe

Java中的Deuqe,即“double ended queue”的縮寫,是Java中的雙端隊(duì)列集合類型,它集成自Deque,完全具備普通隊(duì)列FIFO的功能,同時它也具備了Stack的LIFO功能,并且保留了push和pop函數(shù),所以使用起來應(yīng)該是一點(diǎn)障礙都沒有。Deque可以由ArrayDeuqe或者LinkedList實(shí)現(xiàn),它們兩者使用的區(qū)別以及優(yōu)劣也就是數(shù)組和鏈表的區(qū)別。

ArrayDeque

ArrayDeque是Deque接口的一種具體實(shí)現(xiàn),是依賴于可變數(shù)組來實(shí)現(xiàn)的。ArrayDeque 沒有容量限制,可根據(jù)需求自動進(jìn)行擴(kuò)容。ArrayDeque可以作為棧來使用,效率要高于 Stack。ArrayDeque也可以作為隊(duì)列來使用,效率相較于基于雙向鏈表的LinkedList也要更好一些。注意:ArrayDeque不支持為null的元素。

LinkedList

LinkedList與ArrayList一樣實(shí)現(xiàn)List接口,只是ArrayList是List接口的大小可變數(shù)組的實(shí)現(xiàn),LinkedList是List 接口鏈表的實(shí)現(xiàn)。基于鏈表實(shí)現(xiàn)的方式使得 LinkedList 在插入和刪除時更優(yōu)于ArrayList。LinkedList實(shí)現(xiàn)所有可選的列表操作,并允許所有的元素包括null。除了實(shí)現(xiàn)List接口外,LinkedList類還為在列表的開頭及結(jié)尾 get、remove 和 insert 元素提供了統(tǒng)一的命名方法。這些操作允許將鏈接列表用作堆棧、隊(duì)列或雙端隊(duì)列。此類實(shí)現(xiàn) Deque 接口,為 add、poll 提供先進(jìn)先出隊(duì)列操作,以及其他堆棧和雙端隊(duì)列操作。所有操作都是按照雙重鏈接列表的需要執(zhí)行的。在列表中編索引的操作將從開頭或結(jié)尾遍歷列表(從靠近指定索引的一端)。同時,與 ArrayList 一樣此實(shí)現(xiàn)不是同步的。因此Java里面是建議使用Deque替換Stack的。

總結(jié)

以上是生活随笔為你收集整理的Java集合—Deque Stack的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。