2022-08-18  阅读(1)
原文作者:潘威威 原文地址:https://blog.csdn.net/panweiwei1994

学完了ArrayListVectorLinkedList的源码后,今天来学习Stack源码。参考的JDK版本为1.8。

Stack继承了Vector,学习了Vector再来学习Stack就变得很简单。Stack,栈,特点是先进后出(FILO, First In Last Out)。Stack是如何实现先进后出的?本文将详细讲解这个问题。

顶部注释

The Stack class represents a last-in-first-out (LIFO) stack of objects. It extends class Vector with five operations that allow a vector to be treated as a stack. The usual push and pop operations are provided, as well as a method to peek at the top item on the stack, a method to test for whether the stack is empty, and a method to search the stack for an item and discover how far it is from the top.

第一段大意为Stack是last-in-first-out (LIFO) 的。它继承Vector,并额外提供了push、pop、peek、empty、search这几个方法。

When a stack is first created, it contains no items.

第二段大意为当stack被第一次创建时,它包含0个元素。

A more complete and consistent set of LIFO stack operations is provided by the {@link Deque} interface and its implementations,

Deque stack = new ArrayDeque ();

第三段大意为Deque接口和它的实现是更强大的先进先出的栈的实现。

Stack类层次结构

先来看看Stack的定义

            public class Stack<E> extends Vector<E>

从中我们可以了解到

  • Stack :说明它支持泛型。
  • extends Vector<<E>>:说明Vector的可序列化、随机访问效率高等等特性它都有。

下图是Stack的类结构层次图

202202131614083471.png

全局变量

Stack的全局变量都是从Vector继承的。

构造方法

接下来,看Stack提供的构造方法。ArrayList提供了一种构造方法。

1.构造空Stack。

                /**
                 * Creates an empty Stack.
                 */
                public Stack() {
                }

方法

public E push( E item)

                /**
                 * 添加元素的到栈顶。
                 *
                 * @param   item  要添加的元素
                 * @return  被添加的元素
                 * @see     java.util.Vector#addElement
                 */
                public E push(E item) {
                    addElement(item);
            
                    return item;
                }

public synchronized E pop()

                /**
                 * 返回栈顶元素,并将其从栈中删除
                 *
                 * @return  栈顶元素
                 * @throws  EmptyStackException 如果栈为空
                 */
                public synchronized E pop() {
                    E obj;
                    int len = size();
            
                    obj = peek();
                    removeElementAt(len - 1);
            
                    return obj;
                }

peek()

                /**
                 * 返回栈顶元素,不删除。
                 *
                 * @return  栈顶元素
                 * @throws  EmptyStackException  如果栈为空
                 */
                public synchronized E peek() {
                    int len = size();
            
                    if (len == 0)
                        throw new EmptyStackException();
                    return elementAt(len - 1);
                }

empty()

                /**
                 * 判断栈是否为空
                 *
                 * @return  栈是否有元素
                 */
                public boolean empty() {
                    return size() == 0;
                }

search(Object)

                /**
                 * 栈底向栈顶方向遍历,查找指定对象o在栈中的位置。
                 * @param   o   指定对象
                 * @return  o的索引,如果没找到,返回-1
                 */
                public synchronized int search(Object o) {
                    int i = lastIndexOf(o);
            
                    if (i >= 0) {
                        return size() - i;
                    }
                    return -1;
                }

Stack的学习就到这里了,List的学习到这里也告一段落了,下一篇文章将对List的各个实现类做总结。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文