从源码理解Stack.java

package java.util;

/**
 * Stack类表示了后进先出(LIFO)的一个容器对象。Stack继承自Vector并扩展了五个操作,使得Vector可以被看作是一个Stack。
 * 常用的push和pop,以及获取栈顶元素的peek,测试栈是否为空的empty,一个搜索操作search并返回其与栈顶的距离
 * 第一次创建的时候,栈中没有元素
 * 更丰富更兼容的LIFO操作由Deque接口提供,Deque使用起来比Stack更好,比如:
 *  Deque<Integer> stack = new ArrayDeque<Integer>();
 */
public class Stack<E> extends Vector<E> {
    /**
     * 构造一个空的Stack
     */
    public Stack() {
    }

    /**
     * 向栈顶压入元素,和addElement(item)等效
     * @param   item   the item to be pushed onto this stack.
     * @return  the <code>item</code> argument.
     * @see     java.util.Vector#addElement
     */
    public E push(E item) {
    		//调用Vector的addElement
        addElement(item);

        return item;
    }

    /**
     * 移除并返回栈顶元素
     * @return  The object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E pop() {
        E       obj;
        int     len = size();
        	//获取栈顶元素
        obj = peek();
        	//移除元素
        removeElementAt(len - 1);

        return obj;
    }

    /**
     * 不移除,只返回栈顶元素
     * @return  the object at the top of this stack (the last item
     *          of the <tt>Vector</tt> object).
     * @throws  EmptyStackException  if this stack is empty.
     */
    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

    /**
     * 测试是否为空
     * @return  <code>true</code> if and only if this stack contains
     *          no items; <code>false</code> otherwise.
     */
    public boolean empty() {
        return size() == 0;
    }

    /**
     * 返回指定元素与栈顶元素的最近距离,对象比较使用equals方法,栈顶元素为坐标起点1
     * @param   o   the desired object.
     * @return  the 1-based position from the top of the stack where
     *          the object is located; the return value <code>-1</code>
     *          indicates that the object is not on the stack.
     */
    public synchronized int search(Object o) {
    		//获取指定元素的下标
        int i = lastIndexOf(o);
        	//size-i为栈顶与当前元素的距离
        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = 1224463164541339165L;
}

时间: 2024-08-08 13:56:29

从源码理解Stack.java的相关文章

从源码理解LinkedList.java

package java.util; import java.util.function.Consumer; /** * List和Deque接口的双向链表实现,实现了所有可选接口,允许空值null * 支持所有双向链表应该支持的操作,深入链表的操作都是从链表头遍历到链表尾 * 该实现不支持并发.多线程访问,至少一个线程修改列表结构时,需要外部同步,如: * List list = Collections.synchronizedList(new LinkedList(...)); * iter

从源码理解ArrayList.java

package java.util; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.UnaryOperator; /** * 可变数组实现了List接口,实现了所有列表操作,允许空值null.还提供了操作数组大小的方法用以内部使用. * 除了不支持并发访问,这个类完全等同于Vector * 以下几个操作都是常数时间:size.isEmpty.ge

从源码理解LinkedHashMap.java

package java.util; import java.util.function.Consumer; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.io.IOException; import HashMap.Node; /** * 哈希表和链表实现Map接口,并具有固定迭代顺序. * LinkedHashMap实现和HashMap的不同之处在于LinkedH

Android源码开发利器——Java源码调试(基于4.1.2)

原文地址:http://blog.csdn.net/jinzhuojun/article/details/8868038 调试Android Java源码 草帽的后花园--Neo 写在之前的话:这里主要是以调试Java源码为主,应该说是在system_process之后的源码,这对于调试和修改frameworks层的人来说真是一个利器,但至于为什么在system_process之后,我还在分析,如果有结果我会更新此文章,并正在尝试调试C++的代码,就是native中的代码,如果这个可行那将会大大

atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结

atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结 1. 为什么虚拟机语言容易被反编译 1 2. 源码泄露的问题问题 1 3. Excelsior JET 1 4. gcj.的流程 2 5. classloader方案,,还凑后 2 6. 制作伪exe,其实和上一种做法是一样的,只不过做成exe,调用系统的java.exe来运行它,这样的工具有nativeJ,exe4j等 3 7. 其他 3 1. 为什么虚拟机语言容易被反编译 ,但虚拟机的中间语言由于带了大量的"元数据&q

型学习笔记5:C源码理解

型学习笔记5:C源码理解 http://jfsqhwhat2.eju.cn/ http://13660038501.i.sohu.com/v2/guestbook/index.htm http://15306736050.i.sohu.com/v2/guestbook/index.htm http://15090269366.i.sohu.com/v2/guestbook/index.htm http://13377896359.i.sohu.com/v2/guestbook/index.htm

HashMap源码理解

导语 HashMap是常用的数据结构,了解HashMap,对提高代码的效率有很大的帮助.HashMap在JDK1.8中对数据结构进行了优化:提高了查询和删除的效率.当然,这也导致了结构更加的复杂:但通过认真阅读源码,还是可以掌握其要领的. 读完本篇文章,你应该理解的内容 点击这里查看大图 说明:HashMap的数据结构是个Hash表(可以理解为数组),每个槽中存放着一些节点. 一般情况下,一个槽中存放一个节点: 数据量较大时,一个槽中可能存放多个节点,此时,各个节点以链表的方式连接在一起: 当一

OpenJDK 源码阅读之 Java 字节流输入类的实现

Java 的输入输出总是给人一种很混乱的感觉,要想把这个问题搞清楚,必须对各种与输入输出相关的类之间的关系有所了解.只有你了解了他们之间的关系,知道设计这个类的目的是什么,才能更从容的使用他们. 我们先对 Java I/O 的总体结构进行一个总结,再通过分析源代码,给出把每个类的关键功能是如何实现的. Java I/O 的主要结构 Java 的输入输出,主要分为以下几个部分: 字节流 字符流 Socket 新 I/O 每个部分,都包含了输入和输出两部分. 实现概要 这里只给出每个类的实现概要,具

OpenJDK 源码阅读之 Java 字节流输出类的实现

Java 的输入输出总是给人一种很混乱的感觉,要想把这个问题搞清楚,必须对各种与输入输出相关的类之间的关系有所了解.只有你了解了他们之间的关系,知道设计这个类的目的是什么,才能更从容的使用他们. 这是这个系列的第二篇,描述字节输出类的实现,第一篇见:OpenJDK 源码阅读之 Java 字节流输入类的实现 字节流输出 图1 Java 字节输出类 OutputStream OutputStream是所有字节输出类的超类,这是个抽象类,需要实现其中定义的 write 函数,才能有实用的功能. pub