美文网首页面试
Stack源码分析-通过源码分析Stack不再被推荐使用的原因

Stack源码分析-通过源码分析Stack不再被推荐使用的原因

作者: _风听雨声 | 来源:发表于2020-05-23 18:02 被阅读0次
Collection家族关系图
栈是java中比较重要的数据结构,具备后进先出的特点,JDK提供了Stack,由于历史原因,目前Stack已经不被推荐使用了。但依然值得去分析它的源码,以便更好的理解栈的概念,也更好的知道它不再被推荐的原因。其次就是Stack源码非常简短,分析它的源码只需要花一点点的时间就可以。Stack继承自Vector,如需了解Vector,可点击Vector源码分析

继承关系

public  class Stack<E> extends Vector<E> 

Stack继承自Vector


构造方法

    public Stack() {
    }

入栈

    public E push(E item) {
        //调用了父类Vector的addElement(item)
        addElement(item);
        return item;
    }
    
    //父类Vector的addElement(item)
    public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }

push(E item)调用了父类VectoraddElement(item)方法,说明3点

  • 1.Stack基于Object[]实现
  • 2.线程安全
  • 3.扩容规则和Vector完全一样

弹栈

    public synchronized E pop() {
        E  obj;
        int  len = size();
        obj = peek();
        removeElementAt(len - 1);
        return obj;
    }

    public synchronized void removeElementAt(int index) {
        modCount++;
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        int j = elementCount - index - 1;
        if (j > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, j);
        }
        elementCount--;
        elementData[elementCount] = null; 
    }

pop()移除栈顶元素,并返回栈顶元素。removeElementAt(int index)是父类Vector的方法。

  • 1.线程安全
    1. 因为是最后一个元素,所以不需要通过System.arraycopy()方法左移,直接将元素数量--,并将最后一个元素置空。

获取栈顶元素

    public synchronized E peek() {
        int  len = size();
        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

      public synchronized E elementAt(int index) {
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
        }
        return elementData(index);
    }

    E elementData(int index) {
        return (E) elementData[index];
    }

调用父类VectorelementAt(int index)获取最后一个元素


总结一下
通过以上分析可以看到,Stack 继承自Vector。然而,它们是两个不同的数据结构。历史久远,也许是当时是为了快速实现栈的数据结构调用Vector的方法,所以继承了Vector,也因为继承了VectorStack 可以复用Vector的大量方法 。Stack不被推荐使用的原因应该主要有以下3点:

  • 1.继承关系设计不严谨
  • 2.Vector方法加synchronized粒度大,性能上有一定影响
  • 3.有了更好的替代方案ArrayDeque

相关文章

  • Stack源码分析-通过源码分析Stack不再被推荐使用的原因

    栈是java中比较重要的数据结构,具备后进先出的特点,JDK提供了Stack,由于历史原因,目前Stack已经不被...

  • Stack

    几句话证明你看过Stack的源码Stack不推荐使用,推荐使用ArrayDeque 1.结构 Stack exte...

  • 搞懂 Java HashMap 源码

    HashMap 源码分析 前几篇分析了 ArrayList , LinkedList ,Vector ,Stack...

  • Stack简介

    Stack简介 Stack基于Vector实现,支持LIFO 后进先出 源码分析 jdk1.7.0_71 默认构造...

  • 栈(Stack源码分析)

    栈(stack) 从数据结构的角度理解:是一组数据的存放方式,特点为LIFO,即后进先出(Last in, fir...

  • DPDK stack源码分析

    在之前分析过dpdk中的相关一些开源实现,然后当时的版本是16.07.2,现在最新的是19.11,代码方面还是有很...

  • Java List接口整理

    java源码分析之List接口以及ArrayList、LinkedList、Stack、Vector等实现类 Li...

  • JDK的Stack源码分析

    一.继承 继承自Vector类 二.核心方法分析 2.1push方法 public E push(E ite...

  • 文章结构 栈是什么 Java中的Stack源码分析 什么时候使用栈 应用实例:使用栈来解决表达式计算问题 1、栈是...

  • Stack源码分析(JDK1.8)

    这篇文章,实际上不应该算是源码分析,这是在源码的思想基础上自己实现的Stack.但是方法与思想是一致。这里先介绍一...

网友评论

    本文标题:Stack源码分析-通过源码分析Stack不再被推荐使用的原因

    本文链接:https://www.haomeiwen.com/subject/msziohtx.html