精华内容
下载资源
问答
  • Java栈

    2016-01-28 19:31:37
    我们天天在说java堆java栈,究竟什么是java栈? 首先需要明确一个概念,那就是通常我们说的堆、栈与java堆、java栈并不是一个东西。java堆和java栈可能都是在我们通常所说的堆中划分出内存的。在java层面上,将这...

    我们天天在说java堆java栈,究竟什么是java栈?

    首先需要明确一个概念,那就是通常我们说的堆、栈与java堆、java栈并不是一个东西。java堆和java栈可能都是在我们通常所说的堆中划分出内存的。在java层面上,将这划分出的内存按其用途称为java堆、java栈。

    《The Java Virtual Machine Specification Java SE 7 Edition》(中文版《Java 虚拟机规范(Java SE 7 版)》)中对java栈是这么解释的:

    每一个Java虚拟机线程都有自己私有的Java虚拟机栈(Java Virtual Machine Stack),这个栈与线程同时创建,用于存储栈帧(Frames, §2.6)。Java虚拟机栈的作用与传统语言(例如 C语言)中的栈非常类似,就是用于存储局部变量与一些过程结果的地方。另外,它在方法调用和返回中也扮演了很重要的角色。因为除了栈帧的出栈和入栈之外,Java虚拟机栈不会再受其他因素的影响,所以栈帧可以在堆(此堆不是java堆,就是我们通常意义所说的堆)中分配 ,Java虚拟机栈所使用的内存不需要保证是连续的。

    Java虚拟机规范允许 Java虚拟机栈被实现成固定大小的或者是根据计算动态扩展和收缩的。如果采用固定大小的 Java虚拟机栈设计,那每一条线程的Java虚拟机栈容量应当在线程创建的时候独立地选定。Java虚拟机实现应当提供给程序员或者最终用户调节虚拟机栈初始容量的手段,对于可以动态扩展和收缩 Java虚拟机栈来说,则应当提供调节其最大、最小容量的手段。

    接下来对此一一解读。
    1、当创建了一个新线程时,都会为其分配一个java栈,另外还会分配一个程序计数器。
    2、Java栈里能pop或push的内容是栈帧(Stack Frame),用类java伪码表示是这样的Stack<StackFrame>.当线程调用一个方法时,将一个新栈帧push进java栈,当一个方法调用结束(无论是正常结束还是抛出异常),从java栈中pop出一个栈帧。
    3、栈帧(Stack Frame)的内容分为三部分:局部变量区、操作数栈、帧数据区。用java伪码可大概表示如下:
    class StackFrame {
    LocalVariable lv;
    OperationStack os;
    FrameData fd;
    ……
    }

    4、栈帧的作用:执行一个方法时,用新入栈的栈帧存储参数、局部变量、中间运算结果等。
    5、因为每个线程都有自己的java栈,所以java栈中的所有数据都是该线程私有的,不存在并发安全问题。
    6、java栈和栈帧在内存中不必是连续的,栈帧可以在堆(非java堆)中分配,java栈和栈帧的具体结构由jvm实现者自行决定。java栈的大小可以是固定的也可是动态计算的大小。

    前面提到java栈里面存的是栈帧,栈帧包含三部分,接下来解释下这三部分的作用。

    1、局部变量区
    局部变量区,顾名思义,是用来存在局部变量和方法调用的参数的。局部变量区类似于数组,是用索引来访问的。如果是非静态方法,局部变量区索引为0的位置是当前对象this的引用。假如有以下方法:

    public void test(String name) {
        int a = ...;
        ... ...
    }

    局部变量区存储的内存非配可能是这样的:局部变量区索引为0的位置是this引用,索引为1的位置是参数name,索引为2的位置是int变量a…
    如果是静态方法,索引为0的位置就不是this引用,需要所有的位置往前推一个。
    需要注意的是,局部变量区中可以存储基本类型(int,double,long,float,returnAddress; boolean,byte,short,char,在这里都转换已经隐式的转换成了int)和引用类型(reference)。如果参数是对象类型,如上面的String,局部变量区绝对不会出现java对象(如某个String值),只会是指向该对象的引用(直接或间接的)。若是基本类型,则存储的是其值。同时,long和double占用了,连续的两个索引位置(即使一个索引位置能装得下long或double值,也会用两个索引位置来存储)。
    我们可以做些推断,在方法调用的时候其java栈帧就要入栈,也就是说,调用方法前就已经知道调用这个方法需要多大的局部变量区了(同样操作数栈的大小也是确定下来了的),事实确实如此,在编译的时候这些信息就已经确定下来了。换个思维,在调用java方法的时候,如果声明了局部变量,它是在调用前就已经为其分配好内存了,而不是调用过程中。那么,在for循环中声明变量会是怎么处理呢?如下面的代码:

    public class Test {
        public static void main(String[] args) {
            for(int i=0; i<1000; i++) {
                String s = String.valueOf(i);
                System.out.println(s);
            }
        }
    }

    基于上面的理论,可以肯定的是,它不会在循环过程中不停的为s分配内存。那它会在调用main方法新建的栈帧的局部变量区中分配1000多个位置吗?如果这件事让我们自己做,我们会怎么处理呢?s在每次迭代开始之前就出了作用域,那么我就可以重用局部变量区的s嘛,真实情况如何?我们运行下javap -c Test,得到main方法如下:

    public static void main(java.lang.String[]);
      Code:
       0:   iconst_0
       1:   istore_1
       2:   iload_1
       3:   sipush  1000
       6:   if_icmpge       27
       9:   iload_1
       10:  invokestatic    #2;//Method java/lang/String.valueOf:(I)Ljava/lang/String;
       13:  astore_2
       14:  getstatic       #3;//Field java/lang/System.out:Ljava/io/PrintStream;
       17:  aload_2
       18:  invokevirtual   #4;//Method java/io/PrintStream.println:(Ljava/lang/String;)V
       21:  iinc    1, 1
       24goto    2
       27return
    }

    在第10条指令调用完String.valueOf(i)后,第13条将其存入局部变量区索引为2的位置,也就是s,OK,我们看到了,它确实一直重用局部变量区索引为2的位置来存取每次迭代中声明的s。

    2、操作数栈
    操作数栈的作用主要用来存储运算结果以及运算的操作数。如果局部变量区一样,它可以存储基本类型(int,double,long,float,returnAddress; boolean,byte,short,char,在这里都转换已经隐式的转换成了int)和引用类型(reference),对象是以引用的形式出现在操作数栈里,操作数栈里也永远不可能出现对象,只会是对象的引用。操作数栈的操作方式不同于局部变量区,操作数栈是以入栈和出栈的形式操作的,如上面main方法去掉System.out.println(s)后的指令集合的含义如下(假设【】表示栈,左边为栈顶):

    public static void main(java.lang.String[]);
      Code:
       0:   iconst_0//将0入栈,栈内容【0】
       1:   istore_1//从栈中弹出一个int,存储到局部变量区索引为1的位置,栈内容【】
       2:   iload_1//将局部变量区索引为1的int值入栈,栈内容:【0】
       3:   sipush  1000//将1000入栈,栈内容【1000,0】
       6:   if_icmpge  27//从栈中弹出两个int,比较器大小,若大于或等于,跳到指令27,栈内容【】
       9:   iload_1
       //将局部变量区索引为1的int值入栈,栈内容:【num】(循环中第21条指令不停的自增局部变量区索引为1的值,该值是动态变化的)
       10:  invokestatic
       //从栈顶弹出一个int,作为参数调用String.valueOf方法,并将调用结果入栈。栈内容【reference】(String.valueOf的返回值是一个String对象,栈里存的是指向该对象的引用)

       13:  astore_2    //将栈顶元素出栈,存到局部变量区索引为2的位置,栈内容【】
       21:  iinc    1, 1//将局部变量区索引为1的int值加1,栈内容【】
       24goto    2 //跳回指令2,栈内容【】
       27return//方法调用结束
    }

    3、帧数据区
    帧数据区用来支持常量池解析,方法正常返回,方法异常处理等内容。

    —————–
    更多阅读:《深入java虚拟机 第二版》第五章,《The Java Virtual Machine Specification Java SE 7 Edition》§2.5,§2.6

    展开全文
  • java

    千次阅读 2011-05-28 18:48:00
    一: java栈在java虚拟机结构中的位置java虚拟机体系结构中包括:类装载子系统、运行时数据区、执行引擎。其中类装载子系统负责查找并装载class文件。 执行引擎处于JVM的核心位置,运行Java的每一个线程都是一个独立...


    一: java栈在java虚拟机结构中的位置

    java虚拟机体系结构中包括:类装载子系统、运行时数据区、执行引擎。其中类装载子系统负责查找并装载class文件。 执行引擎处于JVM

    的核心位置,运行Java的每一个线程都是一个独立的虚拟机执行引擎的实例,从线程生命周期的开始到结束,他要么在执行字节码,要么在执行

    本地方法。运行时数据区包括方法区、java堆、java栈、程序计数器和本地方法区。

     

    二: java栈的组成

    栈的基本单位是帧(或栈帧): 每当一个java线程运行的时候, java虚拟机会为该线程分配一个java栈。该线程在执行某个java方法的时候, 向java栈压入一个帧, 这个帧用于存储参数、局部变量、操作数、中间运算结果等。当这个方法执行完的时候, 帧会从栈中弹出。Java栈上的所有数据是私有的,其他线程都不能该线程的栈数据。

    栈帧由局部变量区、操作数栈和帧数据区三个部分组成。

    (1) 局部变量区:局部变量区大小按字长计算,局部变量区的大小在编译的时候可以预知: 局部变量区被组织成一个以字长为单位的数组,每个局部变量的空间是32位的,基本类型byte、char、short、boolean、int、float及对象引用等占一个局部变量空间, long、double占两个局部变量空间。在访问long和double类型的局部变量时,只需要取第一个变量空间的索引即可。

     

     

    (2) 操作数栈: 操作数栈和局部变量区一样,也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。操作数栈是临时数据的存储区域。 

    float subTotal = 100;
    
    float tax = 5;
    
    float total = subTotal + tax;

     

    在操作数栈的运行过程:1. 将100压入操作数栈 2. 将5压入操作数栈 3. 将100和5从栈中弹出,执行add指令,将结果105压入操作数栈 4.从栈中弹出结果105返回。

    (3)帧数据区: 帧数据区存放了指向常量池的指针地址,当某些指令需要获得常量池的数据时,通过帧数据区中的指针地址来访问常量池的数据。此外,帧数据区还存放方法正常返回和异常终止需要的一些数据。


    三: 栈内存的优点和缺点

    java虚拟机中变量存储相关的内存分为栈内存和堆内存。在方法中定义的一些基本类型的变量和对象的引用变量都在栈内存中分配,对象实例和数组在堆内存分配。

    栈的优点:

    1. 存取速度比堆要快,仅次于直接位于CPU中的寄存器;

    2. 栈数据可以共享。  

    int first = 100;
    
    int second = 100;
    

    编译器先处理int first = 100;首先它会在栈中创建一个变量为first的引用,然后查找有没有字面值为100的地址,没找到,就开辟一个存放100这个字面值的地址,然后将first指向100的地址。接着处理int second = 100;在创建完second的引用变量后,由于在栈中已经有100这个字面值,便将second直接指向100的地址。这样,就出现了first与second同时均指向100的情况, 起到数据共享的作用。

    栈的缺点: 栈中的数据大小与生存期必须是确定的,缺乏灵活性, 相反,堆内存中的数据在运行期动态分配,比较灵活。但是堆内存的数据需要jvm的垃圾回收机制来回收不再使用的对象。

    展开全文
  • JVM进阶(一)——初识JAVA栈

    万次阅读 多人点赞 2017-01-08 14:12:50
    JVM进阶(一)——初识JAVA栈  若想使自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。   下面...

    #JVM进阶(一)——初识JAVA栈
      若想使自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。
    这里写图片描述
      下面言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看图:
    这里写图片描述
      这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。
      栈是我们最常用的内存区域。它主要用来存放基本类型变量,局部变量以及对象的引用。例如:User user = new User();这里的user就是对象的引用也可以理解为地址,指引着虚拟机要去哪里找user这个对象。 他们的基本关系如图:
    这里写图片描述
      由图可知,当我们将一个对象作为方法的参数时,我们在方法中改变对象的值,也会影响到原来的对象的值,因为我们只是改变了图中内存区域的值,他的指引(地址)还是一样的。同时也可以看出,栈的内存区域是连续的,有大小限制的,如果超过了就会抛出栈溢出的异常StackOverflowError。
      在每个方法执行的时候,都会创建一个个的栈帧,用于保存局部变量表,操作数栈,动态链接等信息(以后都会详细讲解)。每次方法的调用都会对应着一个栈帧,因此可以解释有我们在写递归程序的时候会不小心报栈溢出的异常,因为栈是有限的,方法调用太多次导致栈帧堆满了栈,所以溢出。看下面代码:
    这里写图片描述
      在参数-Xss128k的情况下的报错。(eclipse中设置参数:右键代码选择Run As–>Run Configurations,在Arguments栏下的VM arguments中填入参数,再Apply,再run)
    这里写图片描述
      每次在方法执行完毕的时候,虚拟机会自动释放掉为该栈所分配的空间,在栈中,对应着一个栈帧的出栈。虚拟机会自动分配与回收内存,因此效率比较高。
      最后做一下栈的总结:

    • 存放基本类型变量,局部变量,对象的引用;
    • 系统自动分配与回收内存,效率较高,快速,存取速度比堆要快;
    • 是一块连续的内存的区域,有大小限制,如果超过了就会栈溢出,并抛出栈溢出的异常StackOverflowError;
    • Java会自动释放掉为该变量所分配的内存空间;

      栈又分为java栈和本地方法栈。顾名思义,本地方法栈自然就是为本地方法提供服务的,java栈是为java服务的。
      注意,JVM栈是每个线程私有的!

    声明:本文图片转载于”这堆干货有点猛“。

    ![这里写图片描述](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMjIwMjEwNjM2NzA1?x-oss-process=image/format,png) ![这里写图片描述](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMjIwMjEwNzMzNDQ2?x-oss-process=image/format,png)
    展开全文
  • java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关。线程最基本的执行行为就是函数的调用。每次函数调用其实是通过java栈传递数据的。 数据结构中的栈的特性:先进...

    java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关。线程最基本的执行行为就是函数的调用。每次函数调用其实是通过java栈传递数据的。

    数据结构中的栈的特性:先进后出,后进先出。FIFO.

    java内存中的栈跟数据结构中的特性相似也是FIFO.但是只支持进栈和出栈操作。

    java栈中保存的主要内容是栈帧。每一次函数调用都会有对应的栈帧被压进去java栈,执行完毕的时候被弹出java栈。如下图所示。


    函数1对应栈帧1,函数2对应栈帧2.函数3对应栈帧3.以此类推。

    函数1调用函数2,函数2调用函数3,函数3调用函数4,以此类推。

    函数1被调用的时候栈帧1入栈,函数2被调用的时候栈帧2入栈,以此类推。

    所以最后被调用的函数在栈顶,也是最先被弹出栈的。

    每一个栈帧保存着函数的局部变量、中间运算结果等数据。

    函数返回的时候,栈帧从java栈弹出。什么时候函数返回呢?两种情况:

    1.正常的return的时候。

    2.程序抛出异常。

    在一个栈帧内,至少包含局部变量表、操作数帧和帧数据区几部分

    思考的问题:没一次函数调用生成栈帧,从而肯定会占用一定的栈空间。所以栈空间内存不足的时候,函数调用无法进行。当请求的栈深度大于最大栈深度的时候系统会抛出StackOverflowError异常。(内存溢出会在以后的章节深入的讲解和汇总)

    java虚拟机制定线程的最大栈空间参数为-Xss,这个参数决定了函数调用的最大深度。

    下面一段代码说明,是一个没有出口的递归。这段代码可能会栈溢出错误。如下所示:

    private static int count=0;
    public static void recursion(){
    count++;
    recursion();
    }
    public static void main(String[] args) {
    try {
    recursion();
    } catch (Exception e) {
    System.out.println("deep of calling="+count);
    e.printStackTrace();
    }
    }


    使用参数-Xss128K执行代码,结果如下:

    deep of calling=2020
    Exception in thread "main" java.lang.StackOverflowError
    at cn.xhgg.test.TestStackDeep.recursion(TestStackDeep.java:6)


    使用参数-Xss256K执行代码,结果如下:

    count=3665
    Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)


    两次内存不同对比:

    内存增大很明显调用次数增加了。

    结论:

    函数嵌套的层数很大程度上有栈的大小决定的。栈越大,函数调用的次数就越多。

    什么因素影响函数在栈中内存大大小呢?下一个章节介绍(java虚拟机jvm局部变量表)



    展开全文
  • JVM之Java栈Java stack

    2019-05-15 12:17:09
    JVM之Java栈Java stack 目录: JVM体系结构概览 JVM之Java栈解析 1. JVM体系结构概览 2. JVM之Java栈解析 stack图 先简单认识,图示在一个栈中有两个栈帧: 栈帧 2是最先被调用的方法,先入栈,然后方法 2...
  • java栈深度

    万次阅读 2016-12-05 19:34:43
    什么是java栈深度? java栈深度有什么用? 我们知道java栈是java虚拟机的一个重要的组成部分,在栈里进行线程操作,存放方法参数等等。 栈在初始化过后是有一定的大小的。 public class Test{    private ...
  • 模拟Java栈溢出过程

    2019-06-22 15:15:01
    Java栈,是指Java虚拟机栈,本地方法栈; Java虚拟机栈是Java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧用于存储局部变量,操作数栈,动态链接(在一个方法中调用另一个方法),方法出口等信息。每...
  • 什么是java栈深度? java栈深度有什么用? 我们知道java栈是java虚拟机的一个重要的组成部分,在栈里进行线程操作,存放方法参数等等。 栈在初始化过后是有一定的大小的。 public class Test{ private int ...
  • java栈是一块线程私有的内存空间,如果说,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关。线程执行的基本行为是函数调用,每次函数调用的数据都是通过java栈传递的。java栈保存的主要内容为栈帧,每...
  • Java栈和栈桢

    千次阅读 2011-11-24 14:14:48
    每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前...
  • 虚拟机JVM中的java栈深度

    千次阅读 2018-09-14 07:40:37
    什么是java栈深度? java栈深度有什么用? 我们知道java栈是java虚拟机的一个重要的组成部分,在栈里进行线程操作,存放方法参数等等。 栈在初始化过后是有一定的大小的。 public class Test{    private int ...
  • JVM——Java栈

    2012-02-26 16:25:08
    每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两个操作:以帧为单位的压栈或出栈。当线程调用一个Java方法时,虚拟机都会在该线程的...
  • 文章目录JVM整体结构本文重点:运行时数据区(内存结构)java栈java栈结构图java栈中栈帧运行过程堆执行引擎划重点(∩_∩) JVM整体结构 JVM与VMWare都是虚拟机的一种。 JVM由三个子系统构成: 类加载器子系统...
  • JVM之java栈

    千次阅读 2013-11-21 19:43:01
    JVM之java栈 简介 与程序计数器一样,Java虚拟机栈(JavaVirtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧...
  • JAVA栈应用之括号匹配

    千次阅读 2018-04-26 23:10:18
    JAVA栈应用之括号匹配 在数据处理中,常常要判断数据中的括号,应用栈来处理及其方便。 当用户输入一个字符串时,遇到左括号时,将其入栈,如’(’ ‘[”’{,而遇到右括号时,如’)”}”]’时,与栈顶的括号与...
  • java栈 函数如何调用

    千次阅读 2016-10-11 17:01:44
    2、当函数返回时,栈帧从java栈中被弹出。 java 方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另外一种 是抛出异常。 以上两种方式都会导致栈帧被弹出。 3、在一个栈帧中,至少包含局部变量表...
  • 最近在看《深入理解Java虚拟机》,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的...1、Java栈Java栈的区域很小,只有1M,特点是存...
  • Java栈与堆

    千次阅读 热门讨论 2011-09-24 21:10:20
    Java栈与堆 ----对这两个概念的不明好久,终于找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势...
  • java 的使用

    万次阅读 2018-09-26 09:46:16
    Stack的基本使用 初始化 Stack stack=new Stack ...取栈顶值(不出) stack.peek() 进栈 stack.push(Object); 出栈 stack.pop(); 实例: public class Test01 { public static void main(String[] args) { ...
  • Java stack方法总结

    万次阅读 多人点赞 2019-01-05 23:19:53
    前言 最近开始在重新刷leetcode,...就重新总结下Stack的方法。 Stack和Collection的关系 Stack来自于Vector,那么显然stack的底层实现是数组。 Stack的方法 java中Stack只有一个无参构造函数。 属于stack自...
  • Java栈与堆

    千次阅读 热门讨论 2008-11-23 14:45:00
    Java栈与堆 ----对这两个概念的不明好久,终于找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,...
  • java栈的实现

    千次阅读 2019-02-10 13:13:07
    * java 使用数组来实现,能存储任意数据 * * @author Linging * @date 2019/2/10 * */ import java.lang.reflect.Array; public class ArrayStack&amp;lt;T&amp;gt; { private final static ...
  • java虚拟机 jvm java堆 方法区 java栈

    千次阅读 2016-03-27 21:12:41
    java堆是java应用程序最密切的内存空间。几乎所有的对象都存在堆中。java堆完全自动化管理,通过垃圾回收机制,垃圾对象会自动清理,不需要显式释放。 根据java垃圾回收机制的不同,java堆可能有不同的结构。最常见...
  • JAVA栈上分配

    2018-06-28 23:28:03
    上分配是java虚拟机提供的一种优化技术,基本思想是对于那些线程私有的对象(指的是不可能被其他线程访问的对象),可以将它们打散分配在上,而不是分配在堆上。分配在上的好处是可以在函数调用结束后自行销毁...
  • Java栈与堆 ————底层原理

    千次阅读 2014-11-19 21:37:39
    Java栈与堆 ----对这两个概念的不明好久,终于找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈...
  • Java栈的实现

    万次阅读 2017-12-31 15:51:45
    是一种只能在一端进行插入和删除操作的特殊线性表。 其中,允许插入和删除的一端称为栈顶,另一端称为底。通常,将的插入操作称为入栈,删除操作称为出栈。入栈时元素总是放在底,而出栈的总是栈顶元素。...
  • Java栈中add()和push()的不同之处

    千次阅读 2020-02-29 22:42:49
    Java栈中add()和push()的不同之处 在日常使用中发现往栈中添加元素既可以用add(),也可以用push()。 需要注意的是栈本身没有add()方法,add()方法是来自栈继承的类 Vector。 Vector类是什么? Vector与ArrayList一样...
  • Java栈 使用方法

    千次阅读 2019-04-09 09:59:34
    实例化 Stack stack=new Stack(); 判断是否为空 stack.empty() 取栈顶值(不出) stack.peek() 进栈 stack.push(Object); 出栈 stack.pop();

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,296
精华内容 26,518
关键字:

java栈

java 订阅