Java Stack源码分析

本文详细解析了Java中的Stack类源码,介绍了其在后进先出(LIFO)场景的应用,列举了主要方法如push、pop、peek等,并指出Stack类的局限性和推荐使用Deque接口。

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)
### 关于 Stack 数据结构的源码解析 #### Java 中 `java.util.Stack` 类的实现 Java 提供了一个名为 `Stack` 的类作为其标准库的一部分,该类继承自 `Vector` 并实现了栈的功能。以下是对其内部工作原理的一些深入探讨: - **构造函数** 构造一个新的空堆栈。 ```java public class Stack<E> extends Vector<E> ``` - **核心方法** - `push(E item)` 方法用于将项压入此堆栈顶部。这实际上是调用了父类 `Vector` 的 `addElement()` 方法来增加元素到列表末端[^1]。 ```java public E push(E item) { addElement(item); return item; } ``` - `pop()` 方法移除并返回位于堆栈顶端的对象。如果尝试从空堆栈弹出,则抛出异常。它通过调用 `elementAt(size() - 1)` 获取最后一个元素,并随后删除这个位置上的对象。 ```java public synchronized E pop() { if (empty()) { throw new EmptyStackException(); } E obj = peek(); removeElementAt(size() - 1); return obj; } ``` - `peek()` 返回但不移除此堆栈顶部的对象;如果堆栈为空则返回 null 或者抛出 NoSuchElementException 异常取决于具体版本的行为。 ```java public synchronized E peek() { int size = size(); if (size == 0) { throw new EmptyStackException(); } return elementAt(size - 1); } ``` - **线程安全性** 因为 `Stack` 继承自 `Vector` 而后者是一个同步容器,所以所有的操作都是线程安全的。然而,在多线程环境中使用时仍需注意潜在的竞争条件和其他并发问题。 对于更高效的非阻塞数据结构或者想要避免遗留 API 带来的性能开销,可以考虑采用其他第三方库如 Google Guava 或 Apache Commons Collections 所提供的替代方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BigDataMLApplication

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

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

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

打赏作者

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

抵扣说明:

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

余额充值