为啥要使用 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 表示最好从Deque
创建Stack
,而不是使用典型的Stack<>
。不幸的是,它没有强调为什么会这样。
双端队列也可以用作 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】:Java 泛型是在集合的初始实现之后添加的; Stack
来自 Java 1.0 - 在添加泛型时并不会破坏现有代码,而是决定添加具有重复功能的类(但提供一致的 API)。这就是为什么你应该更喜欢 Deque
- 它提供了一个与所有其他 Java Collection
s 一致的 API。
【讨论】:
错了,Stack<E>
也支持 Java 泛型。
所以,为了清楚起见,您的意思是实现Deque
接口而不是Stack<>
?
@PatrickParker 我的措辞可能很尴尬。直到 Java (1.)2 才添加集合,Java 5 是泛型,Java 6 中添加了 Deque。但 Stack
早于所有这些!
泛型与原因无关,因为 Stack 支持泛型。原因更多地与 Stack 和 Vector 一样,由于其同步工作方式而存在固有缺陷。他们无法解决这个问题,因为明确依赖于同步逻辑的类会中断。【参考方案2】:
Stack
扩展了Vector
,这意味着它为每个单独的操作提供synchronizes
。
很可能只有一个线程访问数据结构,因此对每个操作进行同步是对 CPU 时间的浪费。您将花费所有时间来获取和释放对象上的锁,而实际添加或删除项目的时间很少。
【讨论】:
以上是关于为啥要使用 Deque 而不是内置 Stack<>? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的
为啥 Stack 使用基于 1 的索引而不是 Java 中的 Array 中的基于 0 的索引?