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

Posted

技术标签:

【中文标题】为啥 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的【英文标题】:Why java.util.Stack is implemented using Vector and Not an Arraylist为什么 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的 【发布时间】:2017-01-26 08:35:55 【问题描述】:

Java 使用 Vector 实现 Stack 类,为什么?虽然看起来 Arraylist 应该是一个更好的选择。 Java 希望 Stack 是线程安全的,还是要求 Stack 通常(我认为不是这种情况)必须是线程安全的,或者还有其他理论可以使用 Vector 在 Java 中实现 Stack?

【问题讨论】:

What are the differences between ArrayList and Vector?的可能重复 因为Java JDK 1.0 中同时引入了Stack 和Vector,而在JDK1.2 中又引入了ArrayList 很长时间 【参考方案1】:

我怀疑这只是历史性的。 java.util.Stack 从 Java 1.0 开始就已经存在,而 ArrayList 直到 1.2 才引入。 Vector 是他们当时实现它的全部。

为什么不在 1.2 中改变它呢?好吧,Sun 和 Oracle 一直小心翼翼地让 Java 随着时间的推移向后兼容,从线程安全转变为非线程安全将是一个重大变化。

【讨论】:

【参考方案2】:

StackVector 出现在 JDK 1.0 中。 ArrayList 直到 JDK 1.2 才添加。 StackVector 的继承已被烘焙到 API 中,因此现在无法更改。

但无论如何,这是一个过时的课程。修复它不是优先事项。 Stack 自己的 Javadoc 文章说:

Deque 接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应优先使用此类。例如:

Deque<Integer> stack = new ArrayDeque<Integer>();

【讨论】:

以上是关于为啥 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的的主要内容,如果未能解决你的问题,请参考以下文章

java.util.Stack类简介

我什么时候应该使用java.util.Stack vs My Own Implementation? [关闭]

java.util.Stack类中的peek()方法

Stack

使用Stack堆栈集合大数据运算

阅读java.util.ArrayDeque源码Note