为什么要使用Deque而不是内置的Stack<>?

3
Java Doc中提到,应该优先使用Deque来创建Stack,而不是使用典型的Stack<>。但不幸的是,它没有强调为什么要这样做。

双端队列也可以用作LIFO(后进先出)堆栈。与传统的Stack类相比,应该优先使用此接口。当将双端队列用作堆栈时,元素从队列的开头推入和弹出。

请问有人能指出为什么要这样做吗?同样地,在哪些情况下我们应避免使用内置的Collections对象?我是一名C++开发人员,现在转向Java,因此任何这样微妙的提示都会很有帮助。
谢谢。

1
栈扩展向量。请参见此答案:https://dev59.com/WnM_5IYBdhLWcg3waieJ - Patrick Parker
P.K. - 如果你更仔细地阅读,你会注意到Stack是Vector的扩展。换句话说,他们所说的关于Vector的每一件事情也同样适用于Stack。 - Patrick Parker
@P.K. 你应该阅读那个问题的所有答案。 - Polygnome
@PatrickParker,啊,最新的链接帮了很大的忙。谢谢你。还有,是否还有其他的“集合”也可能存在这个问题? - P.K.
@PatrickParker,谢谢,我会小心使用这两个——栈和哈希表。非常感谢你的帮助。 - P.K.
显示剩余3条评论
2个回答

6

Stack继承自Vector,这意味着它会为每个单独的操作进行同步。

如果只有一个线程访问数据结构,那么在每个操作上同步是浪费CPU时间的。你会花费大量时间抓取和释放对象的锁,并且很少添加或删除项。


0
Java泛型是在集合的初始实现之后添加的;Stack来自Java 1.0-而不是在添加泛型时破坏现有代码,决定添加重复功能但提供一致API的类。这就是为什么您应该优先考虑Deque-它提供了与所有其他Java Collection一致的API。

3
错误,Stack<E> 也支持Java泛型。 - Patrick Parker
所以,只是为了明确,您的意思是实现一个Deque接口而不是Stack<> - P.K.
@PatrickParker,我的措辞可能有些拙劣。集合是在Java(1.)2中添加的,泛型是Java 5,Deque是在Java 6中添加的。但是Stack比所有这些都要早! - Elliott Frisch
5
泛型与原因无关,因为Stack支持泛型。原因更多与Stack和Vector一样,本质上存在缺陷,这是由于它们的同步方式造成的。他们无法修复该问题,因为明确依赖于该同步逻辑的类将会被破坏。 - Mark Rotteveel
泛型确实是后来添加的。但它们并不是Java创建集合层次结构的原因,除了Java已经拥有的内容外。 - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接