java1.7集合源码阅读: Stack

Stack类也是List接口的一种实现,也是一个有着非常长历史的实现,从jdk1.0开始就有了这个实现。

Stack是一种基于后进先出队列的实现(last-in-first-out (LIFO)),实际上jdk也提供了有关队列的其他实现,这里就先看看Stack的实现:

类定义:

public class Stack<E> extends Vector<E> { //从类定义看,Stack是线程安全的
.....
}

看看Stack提供的一些CRUD方法:

 1    /**
 2      * Pushes an item onto the top of this stack. This has exactly
 3      * the same effect as:
 4      * <blockquote><pre>
 5      * addElement(item)</pre></blockquote>
 6      *
 7      * @param   item   the item to be pushed onto this stack.
 8      * @return  the <code>item</code> argument.
 9      * @see     java.util.Vector#addElement
10      */
11     public E push(E item) {  //  push方法是在队尾增加一个元素
12         addElement(item);
13
14         return item;
15     }
16
17     /**
18      * Adds the specified component to the end of this vector,
19      * increasing its size by one. The capacity of this vector is
20      * increased if its size becomes greater than its capacity.
21      *
22      * <p>This method is identical in functionality to the
23      * {@link #add(Object) add(E)}
24      * method (which is part of the {@link List} interface).
25      *
26      * @param   obj   the component to be added
27      */
28     public synchronized void addElement(E obj) {  //Vector中的方法
29         modCount++;
30         ensureCapacityHelper(elementCount + 1);
31         elementData[elementCount++] = obj;
32     }

重点注意一下pop方法:

 1     /**
 2      * Removes the object at the top of this stack and returns that
 3      * object as the value of this function.
 4      *
 5      * @return  The object at the top of this stack (the last item
 6      *          of the <tt>Vector</tt> object).
 7      * @throws  EmptyStackException  if this stack is empty.
 8      */
 9     public synchronized E pop() {  //pop方法是获取并删除队尾的元素
10         E       obj;
11         int     len = size();
12
13         obj = peek();  //见后续peek()方法
14         removeElementAt(len - 1);
15
16         return obj;
17     }
18  /**
19      * Deletes the component at the specified index. Each component in
20      * this vector with an index greater or equal to the specified
21      * {@code index} is shifted downward to have an index one
22      * smaller than the value it had previously. The size of this vector
23      * is decreased by {@code 1}.
24      *
25      * <p>The index must be a value greater than or equal to {@code 0}
26      * and less than the current size of the vector.
27      *
28      * <p>This method is identical in functionality to the {@link #remove(int)}
29      * method (which is part of the {@link List} interface).  Note that the
30      * {@code remove} method returns the old value that was stored at the
31      * specified position.
32      *
33      * @param      index   the index of the object to remove
34      * @throws ArrayIndexOutOfBoundsException if the index is out of range
35      *         ({@code index < 0 || index >= size()})
36      */
37     public synchronized void removeElementAt(int index) {  //Vector中的方法,删除指定index元素
38         modCount++;
39         if (index >= elementCount) {
40             throw new ArrayIndexOutOfBoundsException(index + " >= " +
41                                                      elementCount);
42         }
43         else if (index < 0) {
44             throw new ArrayIndexOutOfBoundsException(index);
45         }
46         int j = elementCount - index - 1;
47         if (j > 0) {
48             System.arraycopy(elementData, index + 1, elementData, index, j);
49         }
50         elementCount--;
51         elementData[elementCount] = null;
52     }

Stack 的peek方法,只是获取元素,但并不会去做删除处理,当队列中没有元素的时候,会报EmptyStackException异常:

    public synchronized E peek() {
        int     len = size();

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

Stack 比较简单,大部分实现都在Vector中,可参考:java1.7集合源码阅读: Vector

时间: 2024-10-07 05:30:12

java1.7集合源码阅读: Stack的相关文章

java1.7集合源码阅读: Vector

Vector是List接口的另一实现,有非常长的历史了,从jdk1.0开始就有Vector了,先于ArrayList出现,与ArrayList的最大区别是:Vector 是线程安全的,简单浏览一下Vector: 类定义: 1 public class Vector<E> 2 extends AbstractList<E> 3 implements List<E>, RandomAccess, Cloneable, java.io.Serializable Vector支

关于java1.7集合源码阅读

工作中每天都会和java集合打交道,虽然以前也看过jdk源码的实现,但有些东西时间长了还是会遗忘,或者有些实现在新版本中有了新的变化,俗话说"温故而知新",所以打算再阅读一下相关源码. java集合包含collection接口的子接口和实现类以及Map接口的子接口和实现两大块,首先先看看这两大块大致内容: Collection接口的子接口及实现: Map接口的子接口及实现:

java1.7集合源码阅读:LinkedList

先看看类定义: 1 public class LinkedList<E> 2 extends AbstractSequentialList<E> 3 implements List<E>, Deque<E>, Cloneable, java.io.Serializable 4 { 5 ....... 6 } LinkedList与ArrayList相比,LinkedList不再实现RandomAccess接口,表明不支持快速随机访问数据,但实现了Deque接

【JDK1.8】JDK1.8集合源码阅读——LinkedList

一.前言 这次我们来看一下常见的List中的第二个--LinkedList,在前面分析ArrayList的时候,我们提到,LinkedList是链表的结构,其实它跟我们在分析map的时候讲到的LinkedHashMap的结构有一定的相似,但是相对简单很多,今天再详细的看一下它的具体结构,以及使用的场景等. 二.LinkedList结构概览 在看具体的结构之前我们先来看一下它的继承关系: 与ArrayList不同的是,LinkedList继承了AbstractSequentialList,从Seq

【JDK1.8】JDK1.8集合源码阅读——Set汇总

一.前言 这一篇里,我将对HashSet.LinkedHashSet.TreeSet进行汇总分析,并不打算一一进行详细介绍,因为JDK对Set的实现进行了取巧.我们都知道Set不允许出现相同的对象,而Map也同样不允许有两个相同的Key(出现相同的时候,就执行更新操作).所以Set里的实现实际上是调用了对应的Map,将Set的存放的对象作为Map的Key. 二.源码分析 这里笔者就以最常用的HashSet为例进行分析,其余的TreeSet.LinkedHashSet类似,就不赘述了. 2.1 结

【JDK1.8】JDK1.8集合源码阅读——TreeMap(二)

目录 一.前言二. TreeMap的结构三.Tree源码解析3.1 TreeMap的成员变量3.2 TreeMap的构造方法3.3 TreeMap的重要方法四.总结 一.前言 在前一篇博客中,我们对TreeMap的继承关系进行了分析,在这一篇里,我们将分析TreeMap的数据结构,深入理解它的排序能力是如何实现的.这一节要有一定的数据结构基础,在阅读下面的之前,推荐大家先看一下:<算法4>深入理解红黑树.(个人比较喜欢算法四这里介绍的红黑树实现:从2-3树到红黑树的过渡很清晰,虽然源码里的实现

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

【源码阅读】Java集合 - ArrayList深度源码解读

Java 源码阅读的第一步是Collection框架源码,这也是面试基础中的基础: 针对Collection的源码阅读写一个系列的文章,从ArrayList开始第一篇. [email protected] JDK版本 JDK 1.8.0_110 概述总结 ArrayList底层是通过数组实现的:其中capacity表示底层数组的长度,而ArrayList长度由size表示: ArrayList允许存放null元素,也可以查找null所在的index, 比如indexOf(), lastIndex

Java集合框架源码阅读之AbstractCollection

AbstractCollection是集合实现类的根抽象实现类,它实现了Collection接口,集合中的三个分支Set.List.Queue都是继承此类之后再进行各自实现的扩展,分别是AbstractSet.AbstractList.AbstractQueue.这三个分支有一些共同之处,需要用一些共同的方法,因此出现了AbstractCollection类,它包含了一些这三个分支都会用到的常用方法.而这三个分支也各有抽象类,因为这三个分支下面的一些具体实现也会有一些当前分支通用的方法,因此也给