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

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

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

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

谢谢。

【问题讨论】:

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

标签: java collections stack deprecated obsolete


【解决方案1】:

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 一样,由于其同步工作方式而存在固有缺陷。他们无法解决这个问题,因为明确依赖于同步逻辑的类会中断。
【解决方案2】:

Stack 扩展了Vector,这意味着它为每个单独的操作提供synchronizes

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多