Java Stack源码分析

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值