Java中Stack详解

前言

开发过程中经常会用到集合,在不用思考的情况下,集合我们肯定是用ArrayList,HashMap,特别点的时候会用到 HashSet。但是,这几个集合类真的是万能的么?针对不同的开发场景,我们需要怎样选择正确的集合呢?那么,这节我们就将一个特别的集合----- Stack,它有一个响亮并且我们不陌生的名字:栈!

今天涉及的知识有:

  1. Stack 原理
  2. Stack 的使用
  3. Stack 和 ArrayList 的区别
  4. 使用示例及结果
一.Stack 原理

首先看段源码:

public class Stack<E> extends Vector<E> {

由此知道 Stack 继承自 Vector,Vector是个什么鬼,接触不多,但我们大概知道它跟 ArrayList 似乎有那么点关系(因为面试的时候会涉及到),具体啥关系,不清楚,那么接着看源码:

public class Vector<E>extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable{

这里,我们知道了两点:

  1. Vector 是 AbstractList 子类
  2. Vector 实现了 List 接口
    ok,让我们再稍微追溯下 ArrayList 源码:
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable{

ArrayList 是 List 的一个实现类,这大家都清楚,关键是这里我们知道了一个信息:ArrayList 是 AbstractList 子类
那么,ArrayList 和 Vector 关系总算清楚了,他们是哥们关系,并且都继承自 AbstractList
从上面所有的分析,我们知道了Stack 本质也是一个 List。其具备 List 所有方法。
然后,我们需要了解的是,Stack 栈是一个 "先进后出"的原理。
那么基于以上,我们需要记住的是:

  • Stack 栈是一个 "先进后出"的原理
  • Stack 本质是一个List,其具备 List 所有方法
二.Stack 的使用
2.1 初始化
Stack stack=new Stack();
2.2 判断Stack是否为空
isEmpty()
2.3 添加元素
push(E item)

我们知道 Stack 也是一个List,而List的添加是 add(E e),那么Stack的 push 和 add 方法有啥不同呢?
下面先看 源码中Stack 的add方法:

    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

Stack 中push方法的源码:

public E push(E item) {
        addElement(item);
    <span class="token keyword">return</span> item<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

追溯 addElement(item) 方法:

    public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }

发现了没?原来stack的push方法最后调用的和stack的add方法是同一个方法,即push调用的其实还是 add方法。

2.4 获取栈顶值,元素不出栈(栈为空时抛异常)
peek()

这里需要注意的是,stack调用peek后,item还是在栈中的,并未被移除,然后在调用peek时要判断stack中是否有元素,否则会引发异常

2.5 是否存在obj
search(Object obj)

返回值为int,若存在,返回值为obj距离栈顶的位置,若不存在,返回 -1

2.6 移除栈顶
pop()

此方法是移除栈顶的元素,并且返回值是移除的item

2.7 其他方法

stack 作为 list,具备 list 常用方法,如:

//获取stack长度
size()
//下标处添加
add(int index, E element)
//添加集合
addAll(Collection<? extends E> c)
//移除对象
remove(Object obj)
//根据下标移除对象
remove(int index)
//清空
clear()

其他关于 list 的方法,这里就不多讲了。

2.8 Stack的通常操作
  • push 入栈
  • pop 栈顶元素出栈,并返回
  • peek 获取栈顶元素,并不删除
三. Stack 和 ArrayList 的区别

stack 和 ArrayList 的最大区别是 stack 是线程安全的,而 ArrayList 不是线程安全的。所以,当涉及到多线程问题的时候,优先考虑使用 stack

四.使用示例及结果

调用代码如下:

    public static void main(String []args){
        System.out.println("我是主函数");
    Stack stack<span class="token operator">=</span><span class="token keyword">new</span> <span class="token function">Stack</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

// stack.isEmpty();//栈是否为空
// stack.push(“A”);//进栈
// stack.peek();//获取栈顶值,元素不出栈
// stack.pop();//栈顶元素出栈
// stack.search(“pp”);

    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"====stack是否为空====="</span><span class="token operator">+</span>stack<span class="token punctuation">.</span><span class="token function">isEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//添加</span>
    stack<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//进栈</span>
    stack<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">"b"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//进栈</span>
    stack<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">"c"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//进栈</span>
    <span class="token comment">//长度</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"====stack==size==1==="</span><span class="token operator">+</span>stack<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//获取栈顶值,元素不出栈(栈为空时抛异常)</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>stack<span class="token operator">!=</span>null<span class="token operator">&amp;&amp;</span><span class="token operator">!</span>stack<span class="token punctuation">.</span><span class="token function">isEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"====stack==topValue====="</span> <span class="token operator">+</span> stack<span class="token punctuation">.</span><span class="token function">peek</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//长度</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"====stack==size==2==="</span><span class="token operator">+</span>stack<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//找下标</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"====stack===========index==="</span><span class="token operator">+</span>stack<span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//移除栈顶</span>
    Object obj<span class="token operator">=</span>stack<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"====stack==pop==obj="</span><span class="token operator">+</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//长度</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"====stack==size==3==="</span><span class="token operator">+</span>stack<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

返回结果:

我是主函数
====stack是否为空=====true
====stack==size==1===3
====stack==topValue=====c
====stack==size==2===3
====stack===========index===3
====stack==pop==obj=c
====stack==size==3===2

ok,今天关于 stack的内容就讲到这里了,谢谢大家。

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值