stack继承vector是因java 1.0为复用其线程安全动态数组能力,push/pop/peek均委托vector方法;但因其违反组合优于继承、暴露非栈接口且性能差,官方推荐用arraydeque等deque实现替代。

Java 中的 Stack 类确实通过继承 Vector 实现,但这属于历史设计,并不推荐在新代码中使用。
为什么 Stack 继承 Vector?
Java 1.0 时期,Stack 被设计为 Vector 的子类,直接复用其线程安全的动态数组能力。Vector 本身是同步(synchronized)的,Stack 在此基础上添加了 push()、pop()、peek() 等栈操作方法,底层全部委托给 Vector 的 addElement()、removeElementAt() 等方法。
Stack 的关键实现细节
它不是“包装”Vector,而是真正继承:
-
push(E item)调用addElement(item)—— 将元素加到 Vector 末尾 -
pop()先检查是否为空,再调用removeElementAt(size() - 1)—— 删除并返回最后一个元素 -
peek()直接返回elementAt(size() - 1)—— 查看最后一个元素 - 所有方法都继承了 Vector 的同步机制,因此天然线程安全(但性能开销大)
为什么不建议使用 Stack?
Stack 是遗留类,官方文档明确建议用 Deque(如 ArrayDeque)替代:
-
ArrayDeque非线程安全但更快,支持高效头尾操作,语义更清晰(push()/pop()/peek()方法仍在) -
Stack违反了“组合优于继承”的设计原则 —— 栈是“有”存储能力,不是“是一种” Vector - 它暴露了 Vector 的非栈方法(如
get(int)、insertElementAt()),破坏封装性
现代写法示例
替代方案简洁且高效:
Deque<string> stack = new ArrayDeque();<br>
stack.push("a");<br>
stack.push("b");<br>
String top = stack.pop(); // "b"</string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











