Java Stack 的简单用法

stack(栈)是数据结构中很重要的成员,在实际运用中其实也有很大左右,包括Android中的FragmentManager就是通过栈来管理fragment页面,如果去看栈的源码的话其实很容易发现Stack是通过数组来实现的。

原理简述

虽然这篇文章的核心是说如何对Stack进行使用,但适当的了解Stack的原理会对使用更有帮助,Stack栈的一大特点就是先进后出,如图进入栈的顺序依次是一号选手,二号选手和三号选手,但出来的顺序却是三号选手,二号选手和一号选手,这是栈这个结构的主要特色。除了先进后出这个特点外,还需要注意的是在Java中万物皆是对象,对象皆可引用,所以实际上在栈中所存的其实也是对象引用

java stack 为什么不推荐使用 语言 java stack操作_数据结构

对象引用

为了更好的说明对象引用这个特点,我们还是以上图作为例子讲解,首先我们的代码逻辑如下:

  1. 将1,2,3号选手依次入栈
  2. 将3号的对象指向4号选手
  3. 获取三号选手的对象

这时候我们得到的对象就是4号选手,这就是Java中的对象引用,那么有人会问了,三号选手呢?三号选手怎么办,实际上我们的三号选手如果没有被其他对象引用,过不了多久就会被无情的GC回收,了解到这一点就是和其他一些结构之间将值进行传入不同,这里更多的是传入引用,所以在使用Stack的时候切记这一点。

GC是Java用于释放内存的垃圾回收机制,目前流程的为G1 GC

java stack 为什么不推荐使用 语言 java stack操作_Stack_02

Stack使用

好了,我们快速步入正题快速看看Stack的常用的那些方法吧

empty()

测试堆栈是否为空。如果栈内没有对象存在,那么就会返回true,在源码逻辑里其实就是对stack的size是否等于0的一个判断。

peek( )

Stack最主要的方法之一,是用来查看堆栈顶部的对象,但不从堆栈中移除它。也就是可以用来查看当前栈顶的一个对象。

pop( )

Stack最主要的方法之一,移除堆栈顶部的对象,并作为此函数的值返回该对象。

push(Object element)

Stack最主要的方法之一,把项压入堆栈顶部。

search(Object element)

返回对象在堆栈中的位置,以 1 为基数。

java stack 为什么不推荐使用 语言 java stack操作_java_03

代码逻辑如下

Stack<Contestant> stack=new Stack<>();
        Contestant firstpeople=new Contestant("一号选手");
        Contestant secondpeople=new Contestant("二号选手");
        Contestant thirdpeople=new Contestant("三号选手");
        if (stack.empty()){	//判断是否为空
            stack.push(firstpeople);
            stack.push(secondpeople);
            stack.push(thirdpeople);		//依次入栈
        }
        System.out.println(stack.peek().name);				//打印栈顶的对象名,此处为三号选手,说明三号选手已经被压入栈顶
        Contestant forthdpeople=new Contestant("四号选手");	
        thirdpeople=forthdpeople;							//将三号引用到四号
        System.out.println(stack.peek().name);				//打印为四号选手,说明三号选手的引用地址已经改变,不希望此处改变的可以使用在入栈的时候在上面重新new一个对象用来引用原地址
        stack.pop();										//将三号选手弹出
        System.out.println(stack.peek().name);				//此处为二号选手
        System.out.println(stack.search(secondpeople));		//返回二号选手的位置,因为为第一个返回1

总结

到此在Java的Stack的简单用法已经结束了,不积硅步无以至千里,掌握Stack只是前进的一小步,但绝对会成为你优秀能力的基石。