首页 > 编程语言 >【Java面试】到底什么是堆区和栈区?

【Java面试】到底什么是堆区和栈区?

时间:2024-12-15 10:56:52浏览次数:8  
标签:栈区 释放 Java 变量 包装 堆区 内存 类型

其实,堆区和栈区从本质上讲没有任何区别,因为它们都是内存的一块区域而已。

它们的区别在于用法。

在我们的代码中,会使用各种各样的变量,而这些变量是会占据内存的,也就涉及到了内存的分配与释放。

当变量出现时,就会产生一个问题:这些变量的使用范围(生命周期)是仅仅局限在一个函数内部还是超越函数?如果是局限在一个函数内部,那么当这个函数执行完后,这个变量占据的内存就可以释放了,这种变量也就是所谓的局部变量。

对于局部变量占据的内存其实非常好管理,内存的分配和释放仅仅只需要移动一个指针(寄存器)就可以实现了,至于为什么,看我接下来如何解释的。

func调用func1,func1调用func2。当执行到func时,在内存中占据一定内存(图中标记func),执行func1和func2同理。而func2执行完成之后,func2的内存就可以释放,指针(寄存器)指向下一个(func1),后面依次类推。总体来看,就是先分配的后释放。发现没有,这和“栈”的概念简直一模一样!所以叫做栈区

接下来我们再来看看堆区。如果一个变量的生命周期超越了函数,那么当函数运行完成之后,这个变量占据的内存是不会被释放的。

那么变量在堆区占据的内存是怎么释放的?

如果像是C语言,就需要程序员自己释放。在Java中,可以等待JVM收取垃圾。

当我们搞明白堆区和栈区的区别,那你知道基本类型和包装类型的区别吗?

其实,在我们实际开发中,除了定义一些常量和局部变量之外,我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且,包装类型可用于泛型,而基本类型不可以。

对于基本数据类型,如果是局部变量,会存放在栈中;如果是全局变量,会存放在堆中。

对于包装类型,因为包装类型本质上都是对象,所以它们都存放在堆中。

它们在以下三点上有明显区别:

1.占用空间不同:相比于包装类型,基本数据类型占用的空间很小。

2.默认值不同:包装类型不赋值默认为null,而基本数据类型有默认值不为null。

3.比较方式不同:对于基本数据类型来说,==比较的是值;对于包装类型来说,==比较的是对象的内存地址。所有整型包装类对象之间值的比较,全部使用equals()方法。

参考网站:Java 面试指南 | JavaGuide

标签:栈区,释放,Java,变量,包装,堆区,内存,类型
From: https://blog.csdn.net/m0_75276797/article/details/144459882

相关文章

  • 【Java面试】深拷贝、浅拷贝和引用拷贝三者的区别
    浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。我想,还有很多人搞不清楚......
  • 学习笔记070——Java中【泛型】和【枚举】
    文章目录1、泛型1.1、为什么要使用泛型?1.2、泛型的应用1.3、泛型通配符1.4、泛型上限和下限1.5、泛型接口2、枚举1、泛型Generics是指在定义类的时候不指定类中某个信息(属性/方法返回值)的具体数据类型,而是用一个标识符来替代,当外部实例化对象的时候再来指定具体的......
  • Java代码执行流程(简易易懂版)上部
    很多同学刚开始学java时看懂了怎么用,却不知道他内存怎么运行的过程,所以会感觉很迷茫,感觉白学了,我也和大家一样,这里我用了三天的时间给大家整理了代码执行时的过程,并且注意的一些事项,如果有不对的地方请大家指出,我在改正我们先定义一个A类在main函数创建A类的对象实例我们来......
  • 【如何获取股票数据02】Python、Java等多种主流语言实例演示获取股票行情api接口之沪
    最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任务是从这些数据中提炼出有价值的信......
  • Java毕设项目:基于Springboot网球场地预约网站系统设计与实现开题报告
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • Java线程命名问题解决
    前言网上冲浪时刷到线程池的文章,想想看自己好像还没在实际场景中设置过线程名称,小小研究一下。研究过程默认命名创建的线程都会有自己的名字,如果不设置,程序会给线程默认的名字,如Thread-0Threadt=newThread(()->{System.out.println(Thread.currentThread().getNam......
  • Java中的包装类
    1.包装类在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支撑基本类型,Java给每一个基本类型都对应了一个包装类型基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean除了Integer和Character,其余基......
  • Java代码实现“杨辉三角“
     杨辉三角简介杨辉三角(Pascal'sTriangle)是一个经典的数学结构,其特点是每一行的数字是其上方两个数字之和。具体来说: 顶部的数字是1。 每一行的开头和结尾的数字也是1。 其他位置的数字是其左上方和右上方数字之和。例如,前几行的杨辉三角如下:   1  11 1......
  • java 开闭原则(ocp)详解刨析和示例
    part01开闭原则(Open/ClosedPrinciple,OCP)是面向对象编程中的一个重要设计原则,属于SOLID原则之一。它的核心思想是“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”。这意味着在软件需求变化时,我们应该能够通过扩展现有代码而不是修改现有代码来实现功能的变化。###原则的......
  • burp(2)利用java安装burpsuite
    BurpSuite安装burpsuite2024.10专业版,已经内置java环境,可以直接使用,支持WindowslinuxmacOS!!!内置jre环境,无需安装java即可使用!!!bp2024.10下载地址:https://pan.baidu.com/s/1E2aVKnnfTWl2SL-ztR_JtQ?pwd=m5pv激活1.首先点击Start.bat2.进入,点击Copy3.点击CN_Burp......