Stack 是 Java 中提供的后进先出(LIFO) 的栈结构类,定义在 java.util 包中。
public class Stack<E> extends Vector<E>- 继承自
Vector,线程安全 - 遵循 LIFO(Last In First Out)
- 方法语义清晰(push/pop/peek)
- 老牌同步栈结构,不推荐新项目使用
public class Stack<E> extends Vector<E>- 继承自 Vector → 所有方法默认是同步的。
- 支持泛型。
- 不推荐用于现代高并发环境。
Object
└── AbstractCollection
└── AbstractList
└── Vector
└── Stack
public E push(E item) {
addElement(item); // 实际调用的是 Vector 的 addElement
return item;
}底层即调用:
public synchronized void addElement(E obj) {
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}- 抛出
EmptyStackException:如果栈为空。 - 实质上调用的是
Vector的removeElementAt。
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}public boolean empty() {
return size() == 0;
}public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}由于继承自 Vector,Stack 所有方法默认 synchronized,属于粗粒度同步。
优点:
- 多线程安全。
缺点:
- 并发性能极差,不适合高并发。
- 所有操作都加锁,导致阻塞严重。
| 特性 | Stack(老版) |
Deque(如 ArrayDeque) |
|---|---|---|
| 线程安全 | (但性能差) | (非线程安全,需加锁) |
| 性能 | 差(synchronized) | 高(无锁) |
| 推荐程度 | 不推荐 | 推荐用 ArrayDeque 代替 |
| 方法语义 | LIFO(push/pop) | 双端操作(支持 LIFO 和 FIFO) |
推荐使用:
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 2