Stack栈的三种含义

Stack栈的三种含义

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

理解stack栈对于理解程序的执行至关重要。easy混淆的是,这个词事实上有三种含义,适用于不同的场合,必须加以区分。

 

含义一:数据结构

stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in,first out)。

Stack栈的三种含义

在这样的数据结构中,数据像积木那样一层层堆起来,后面添�的数据就放在最上层。使用的时候,最上层的数据第一个被用掉,这就叫做”后进先出”。

与这样的结构配套的是以下几种特定的方法:

(1)push:在最顶层添�数据

(2)pop:返回并移除最顶层的数据

(3)top:返回最顶层数据的值,但不移除它

(4)isempty:返回一个布尔值,表示当前stack是否为空栈。

 

含义二:代码执行方式

stack的另外一种含义是“调用栈”,表示函数或子例程像堆积木一样存放,以实现层层调用。

class Student

{

int age;

string name;

public student(int age,string name)

{

this.age=age;

setName(Name);

}

public void setName(string name)

{

this.name=Name;

}

}

public class Main()

{

public static void main()

{

student s;

s=new student(23,”John”);

}

}

上面代码执行的时候,首先调用main方法,里面须要生成一个student的实例,于是又调用student构造函数。在构造函数中又调用setName方法。

Stack栈的三种含义

含义三:内存区域

stack栈的第三种含义是存放数据的一种内存区域。程序执行的时候,须要内存空间存放数据。一般来说系统会划分出两种不同的内存空间:一种叫stack(栈),还有一种叫做heap(堆).

 

它们的主要差别是:stack是有结构的,每一个区块依照一定的次序存放,能够明白知道每一个区块的大小;heap是没有结构的,数据能够随意存放。因此,stack的寻址速度要快于heap。

 

其它的差别还有,一般来说,每一个线程分配一个stack,每一个进程分配一个heap,也就是说,stack是线程独占的,heap是线程共用的。此外,stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大小是不确定的,须要的话能够不断添加�。

 

依据上面这些差别,数据存放的规则是:仅仅要是局部的、占用空间确定的数据,一般都存放在stack里面,否则就放在heap里面。

 

public void Method()

{

int i=4;

int y=2;

class cls1=new class1();

}

上面代码的Method方法,共包括三个变量:i、y、cls1.当中,i和y的值是整数,内存占有空间是确定的,并且是局部变量,仅仅有在Method区块之间,不会用于区块之外。cls1也是局部变量,可是类型为指针变量,指向一个对象的实例.指针变量占用的大小是确定的,可是对象实例以眼下的信息无法确知所占用的内存空间大小.

 

因此,i、y、cls1都存放在stack,由于它们占用内存空间都是确定的,并且本身也属于局部变量。可是,cls1指向的对象实例存放在heap,由于它的大小不确定。

作为一条潜规则须要记住,全部的对象都存放在heap。

 

接下来的问题是,当Method方法执行结束,会发生什么事?

回答是整个stack被清空,i、y和cls1这三个变量消失,由于它们是局部变量,区块一旦执行结束,就不是必需再存在了。而heap之中的那个对象实例继续存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收。因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却由于种种原因,没有被系统回收。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118325.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vmware ubuntu无法联网_虚拟机ubuntu连不上网

    vmware ubuntu无法联网_虚拟机ubuntu连不上网VMwareWorkstationUbuntu20.04LTS无法连接网络问题本文记录了自己使用的安装在VMwareWorkstation上的Ubuntu20.04无法连接到网络的解决过程——终于解决困扰我两个小时的问题出现问题毫无征兆,平时使用正常的Ubuntu在今天打开后发现无法连接到网络,wire图标也莫名的消失,并且在打开网络设置,也没有对wired的设置模块,至于为何会出现这种问题目前没有任何头绪。解决1、将虚拟机网络设置为NAT模式在菜单栏中依次选择:虚拟机>

    2022年9月5日
    3
  • 104规约(持续更新….)

    104规约(持续更新….)1. 固定帧:启动字符+长度+控制域一+ 控制域二+ 控制域三+ 控制域四常见报文:启动链路:680407000000      (U帧)启动链路确认:68040B000000   (U帧)测试帧:680443000000         (U帧)测试确认:680483000000…

    2022年6月20日
    42
  • java 4舍5入_java四舍五入问题

    java 4舍5入_java四舍五入问题//#1publicdoubleround(doublein){doubledec=in-(int)in;doubleout=dec>=0.5?(int)i+((int)((dec-0.5)/0.25))*0.5+0.5:(int)i+((int)(dec/0.25))*0.5;returnout;}//Math.round(…

    2022年5月22日
    31
  • java怎么判断对象不为空_java判断对象是否为空的方法

    java怎么判断对象不为空_java判断对象是否为空的方法java判断对象是否为空的方法发布时间:2020-06-2514:39:17来源:亿速云阅读:134作者:Leah这篇文章将为大家详细讲解有关java判断对象是否为空的方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先来看一下工具StringUtils的判断方法:一种是org.apache.commons.lang3包下的;另一种是org.s…

    2022年6月3日
    110
  • 航天信息金税盘接口 js 调用

    航天信息金税盘接口 js 调用航天信息金税盘接口js调用背景最近项目要求与单机版的金税盘接口进行对接,在这里简单记录一下自己的开发经验,希望可以帮助到有需要的人PS:接口使用js对接,仅支持ie浏览器。前置条件在进行开发时候需要有一些前置条件ie浏览器开启activeX控件设置–>Internet选项–>安全–>自定义级别把activeX…

    2022年4月30日
    72
  • SSL协议分析「建议收藏」

    SSL协议分析「建议收藏」SecureSocketsLayerSSL协议概述SSL解决的问题(功能)协议的使用SSL在协议栈的位置SSL协议的分层模型SSL体系结构SSL的两个重要概念主要工作流程SSL握手协议的握手过程SSL记录层的功能SSL协议脆弱性分析SSL协议概述SecureSocketsLayer安全套接字协议SSL协议可用于保护正常运行于TCP之上的任何应用协议,如HTTP、FTP、SMTP或Telnet的通信,最常见的是用SSL来保护HTTP的通信。SSL协议的优点在于它是与应用层协议无关的。

    2022年6月2日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号