JDK底层实现源码分析系列(三) Stack源码分析

Author Avatar
Binux 3月 13, 2017
  • 在其它设备中阅读本文章

“合抱之木 生于毫末 九层之台 起于累土 千里之行 始于足下”

前言

JDK 版本1.7

Collection 大家族

Collection

来源Java Collections Framework

Stack 继承树

Stack

Stack

分析

Stack从字面上理解就是栈,先进后出,继承Vector也就是说他完全可以当做Vector使用,并且他内部只增加了5个方法用来实现栈的特性

之前已经讲过Vector的源码分析了,本篇就只讲讲他是如何实现先进后出的

  • public boolean empty()
  • public synchronized E peek()
  • public synchronized E pop()
  • public E push(E item)
  • public synchronized int search(Object o)

从上面的方法可以看出Stack对取出数据的操作都加了synchronized,说明他是支持并发取出数据的

peek()和pop()的区别仅在于前者不会删除元素,后者会

另外多了个search(Object o) 搜索最后出现的此元素元素

    /**
     * 本质上还是调用父类的方法lastIndexOf来确定最后出现此元素的索引
     */
    public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

总结

Stack的源码还是很简单的,只比Vector多了几个方法用来实现栈的特性

其实实现栈可以使用LinkedList来实现,LinkedList和Stack实现栈的区别只在于LinkedList底层是使用链表来存储数据的,而Stack是使用数组存储的

在选择使用哪个的时候看是否需要频繁的删除或插入指定index的数据

如果频繁那只能选择LinkedList,反之一定得选择Stack,底层的存储数据的结构不同导致他们的使用场景都各有优势


著作权声明

本文首次发布于 Binux Blog,转载请保留以上链接