Java Stack源码分析
适用场景
Stack
类是Java集合框架中的一部分,用于表示后进先出(LIFO)的对象堆栈。它扩展了Vector
类,并提供了一些常见的堆栈操作。由于Stack
类在设计上存在一些不足和性能问题,因此在实际开发中,更推荐使用Deque
接口及其实现类来代替Stack
类。
方法总结
Stack
类继承自Vector
类,并添加了一些堆栈操作的方法。以下是该源码中的主要方法:
push(E item)
:将元素压入堆栈顶部。pop()
:移除并返回堆栈顶部的元素。peek()
:查看堆栈顶部的元素,但不移除它。empty()
:判断堆栈是否为空。search(Object o)
:搜索指定元素在堆栈中的位置。
用法及示例
Stack<String> stack = new Stack<>();
// 将元素压入堆栈
stack.push("Apple");
stack.push("Banana");
stack.push("Cherry");
// 查看堆栈顶部的元素
String topElement = stack.peek();
System.out.println("Top Element: " + topElement);
// 移除并返回堆栈顶部的元素
String poppedElement = stack.pop();
System.out.println("Popped Element: " + poppedElement);
// 判断堆栈是否为空
boolean isEmpty = stack.empty();
System.out.println("Is Empty: " + isEmpty);
// 搜索元素在堆栈中的位置
int position = stack.search("Banana");
System.out.println("Position of 'Banana': " + position);
输出:
Top Element: Cherry
Popped Element: Cherry
Is Empty: false
Position of 'Banana': 2
中文源码
/**
* <code>Stack</code>类表示一个后进先出(LIFO)的对象堆栈。它通过继承<tt>Vector</tt>类,提供了五个操作用于将向量作为堆栈来处理。
* 提供了常见的<tt>push</tt>和<tt>pop</tt>操作,以及查看堆栈顶部元素的<tt>peek</tt>方法,判断堆栈是否为空的<tt>empty</tt>方法,
* 以及在堆栈中搜索元素并返回距离堆栈顶部的距离的<tt>search</tt>方法。
* <p>
* 当创建堆栈时,它不包含任何元素。
*
* <p>推荐使用更完整和一致的后进先出堆栈操作的{@link Deque}接口及其实现类,而不是使用这个类。例如:
* <pre> {@code
* Deque<Integer> stack = new ArrayDeque<Integer>();}</pre>
*
* @author Jonathan Payne
* @since JDK1.0
*/
public class Stack<E> extends Vector<E> {
/**
* 创建一个空堆栈。
*/
public Stack() {
}
/**
* 将一个元素压入堆栈的顶部。与以下代码效果相同:
* <blockquote><pre>
* addElement(item)</pre></blockquote>
*
* @param item 要压入堆栈的元素。
* @return 参数<code>item</code>。
* @see java.util.Vector#addElement
*/
public E push(E item) {
addElement(item);
return item;
}
/**
* 移除堆栈顶部的对象并将其作为函数的返回值。
*
* @return 堆栈顶部的对象(<tt>Vector</tt>对象的最后一个元素)。
* @throws EmptyStackException 如果堆栈为空。
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
/**
* 查看堆栈顶部的对象,但不从堆栈中移除它。
*
* @return 堆栈顶部的对象(<tt>Vector</tt>对象的最后一个元素)。
* @throws EmptyStackException 如果堆栈为空。
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
/**
* 判断堆栈是否为空。
*
* @return <code>true</code>如果堆栈不包含任何元素;<code>false</code>否则。
*/
public boolean empty() {
return size() == 0;
}
/**
* 返回对象在堆栈中的位置(从1开始计数)。
* 如果对象<tt>o</tt>作为一个项出现在堆栈中,该方法返回离堆栈顶部最近的项的距离;
* 堆栈的顶部元素被认为是距离<tt>1</tt>。
* 使用<tt>equals</tt>方法将<tt>o</tt>与堆栈中的项进行比较。
*
* @param o 需要查找的对象。
* @return 对象在堆栈中的位置(从堆栈顶部开始计数);
* 如果对象不在堆栈中,则返回值为<code>-1</code>。
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
/** 使用JDK 1.0.2的serialVersionUID以实现互操作性 */
官方链接
if (i >= 0) {
return size() - i;
}
return -1;
}
/** 使用JDK 1.0.2的serialVersionUID以实现互操作性 */
## 官方链接
[Stack - Java SE 16 & JDK 16](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/Stack.html)