为啥要使用 Deque 而不是内置 Stack<>? [复制]

Posted

技术标签:

【中文标题】为啥要使用 Deque 而不是内置 Stack<>? [复制]【英文标题】:Why to use a Deque instead of inbuilt Stack<>? [duplicate]为什么要使用 Deque 而不是内置 Stack<>? [复制] 【发布时间】:2018-10-25 21:51:03 【问题描述】:

Java Doc 表示Stack 最好从Deque 创建,而不是使用典型的Stack&lt;&gt;。不幸的是,它没有强调为什么会这样

双端队列也可以用作 LIFO(后进先出)堆栈。应优先使用此接口而不是旧的 Stack 类。当双端队列用作堆栈时,从双端队列的开头推送和弹出元素。

有人可以指出为什么会这样吗?同样,是否还有其他情况我们应该避免使用内置的Collections 对象?我是一名转向 Java 的 C++ 开发人员,因此任何此类微妙的指针都会有所帮助。

谢谢。

【问题讨论】:

堆栈扩展向量。看到这个答案:***.com/questions/1386275/… @PatrickParker,好吧,我不认为这个问题回答了我的疑问。来吧,接受的答案只是说“至于 Stack 等价物 - 我先看看 Deque/ArrayDeque。” 你认为将其归类为 dup 就足够了吗?跨度> PK - 如果您仔细阅读,您会注意到 Stack 是 Vector 的扩展。换句话说,他们所说的关于 Vector 的每一件事适用于 Stack。 @P.K.您应该阅读该问题的所有答案。 另请阅读此答案,该答案更深入地讨论了堆栈; ***.com/a/35372152/7098259 【参考方案1】:

Stack 扩展了Vector,这意味着它synchronizes 用于每个单独的操作。

很可能只有一个线程访问数据结构,因此对每个操作进行同步是对 CPU 时间的浪费。您将花费所有时间来获取和释放对象上的锁,而实际添加或删除项目的时间很少。

【讨论】:

【参考方案2】:

Java 泛型是在集合的初始实现之后添加的; Stack 来自 Java 1.0 - 在添加泛型时并不会破坏现有代码,而是决定添加具有重复功能的类(但提供一致的 API)。这就是为什么你应该更喜欢 Deque - 它提供了一个与所有其他 Java Collections 一致的 API。

【讨论】:

错了,Stack&lt;E&gt; 也支持 Java 泛型。 所以,为了清楚起见,您的意思是实现Deque 接口而不是Stack&lt;&gt; @PatrickParker 我的措辞可能很尴尬。直到 Java (1.)2 才添加集合,Java 5 是泛型,Java 6 中添加了 Deque。但 Stack 早于所有这些! 泛型与原因无关,因为 Stack 支持泛型。原因更多地与 Stack 和 Vector 一样,由于其同步工作方式而存在固有缺陷。他们无法解决这个问题,因为明确依赖于同步逻辑的类会中断。

以上是关于为啥要使用 Deque 而不是内置 Stack<>? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的

为啥要使用 CComBSTR 而不是只传递 WCHAR*?

为啥 Stack 使用基于 1 的索引而不是 Java 中的 Array 中的基于 0 的索引?

Python list 可以在迭代期间发生变异,但不能在 deque 中发生变异。为啥?

C++STL之stack和queue以及deque详解

C++STL之stack和queue以及deque详解