转自:https://course.tianmaying.com/java-basic+object-usage#

堆和栈的区别

堆和栈都是Java中常用的存储结构,都是内存中存放数据的地方:

1.在方法中定义的基本类型变量和引用类型变量,其内存分配在栈上,变量出了作用域(即定义变量的代码块)就会自动释放

2.堆内存主要作用是存放运行时通过new操作创建的对象

下面这张图展示了Car myCar = new Car();这行代码运行时的内存状态:

图中0x6E34是我们假设的内存地址。myCar作为一个引用类型变量保存在栈中,你可以直观地认为myCar变量保存的就是所创建对象在堆中的地址0x6E34,即myCar引用了一个对象,这正是引用类型变量这个叫法的原因;而堆中则保存着的对象本身,包含了其成员变量,如speedcolorengine

如果成员变量没有在构造器中初始化,则会是默认值。speedcolorint基本类型,默认值为0engine为引用类型,默认值为null,即不引用任何对象。

你可以创建多个对象,每个对象都会在堆中拥有自己单独的内存空间,例如:

Car myCar = new Car();
Car herCar = new Car();

此时内存状态如下:

一个对象的成员变量,如果是引用类型的变量的话,比如engine,则该成员变量可以引用到堆中的其它对象。 如下代码:

Engine engine = new Engine(180);
Car myCar = new Car(0xffffff, 100, engine);

此时内存状态如下:

堆中的对象如果没有任何变量引用它们时,Java就会适时地通过垃圾回收机制释放这些对象占据的内存。你可以认为没有任何引用的对象(即没有任何引用类型的变量指向它),这个对象就成为"垃圾",Java虚拟机就会清理它们,为将来要创建的对象腾出空间。

了解了堆和栈的区别,理解引用类型和基本类型的区别就很容易了。比如我们定义如下代码:

int color = 0;
int speed = 100;
Car myCar = new Car(color, speed);

则内存状态如下:

与引用类型myCar不同,基本类型变量的值就是存储在栈中,作用域结束(比如main方法执行结束)则这些变量占据的栈内存会自动释放。

(009) java后台开发之堆和栈的区别相关推荐

  1. java面试 内存中堆和栈的区别

    java中的内存,分为两种,一为堆内存,二为栈内存. 栈内存 在函数中定义的基本类型的变量和对象的引用变量都是在函数的栈内存中分配. 当在一段代码块中声明了一个变量时,java就会在栈内存中为这个变量 ...

  2. 跨专业转计算机拿下百度java后台开发的经验分享

    前言 本文出自我的一位朋友,他是跨专业最终成功转行计算机,拿下了百度的java后台开发offer,之前他一直说着要给大家分享一波经验,今天完成了写作,希望对大家有帮助.(PS:另外也欢迎大家投稿分享自 ...

  3. 远景能源java后台开发实习面试题

    远景能源java后台开发实习面试题 springboot MVC mysql优化(建索引) 锁,自旋锁,轻量锁 Java动态代理 垃圾回收 hashmap底层,怎么查数据,取余 string和stri ...

  4. Java中的堆和栈的区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先 ...

  5. 蘑菇街Java后台开发一二面面经

    蘑菇街Java后台开发一二面面经 ​ ​ ​ ​ 本菜鸡妹妹的春招上岸之路,第一次挂经献给蘑菇街. 时间线 时间 状态 2020/3/6 内推投递后端开发岗位 2020/3/11 邮件确认一面时间 2 ...

  6. JAVA中堆和栈的区别和联系

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于储存实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...

  7. Java堆和栈的区别/联系详解

    Java堆和栈的区别/联系详解 关于Java中堆栈内存的知识,算是基础知识,和C语言中的指针有一些类似,面试中也经常会被问到,特别是跟Java和C都有关的开发工作. 一.堆栈的联系 在Java中,内存 ...

  8. (001) java后台开发之流程初识

    java 后台开发流程 这篇文章为了奠基一下被我打入冷宫两个月左右的iOS开发,因为之前由于iOS项目停止的原因,被调至后台开发,两个月中也学习到了很多关于Java.sql.js.jsp的内容,感谢我 ...

  9. 长沙哪招jaVa后端开发人才_求职:Java后台开发-何柄融-湖南大学

    联系方式 找到工作了,就不乱发了.谢谢. 个人信息 何柄融/男/1997 本科/湖南大学/自动化专业/19届 技术博客:何柄融​www.zhihu.com 期望职位:java后台开发 项目经历 蔬菜大 ...

最新文章

  1. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集
  2. iOS开发-面试总结(十四)
  3. Django中实现MySQL主从同步实现读写分离
  4. CentOS6 YUM安装MariaDB10.3.10
  5. python数据库模糊查询_Python操作mongodb数据库进行模糊查询操作示例
  6. 关于python语言的编程模式、哪个说法正确_测验1: Python基本语法元素 (第1周) 单选题+程序题...
  7. android面试题精选
  8. MVC上传文件受限制
  9. 数据传输服务 DTS > 数据订阅 > 数据订阅(新版) > 创建RDS MySQL数据订阅通道(新版)
  10. linux kvm图标需要安装的软件,KVM 图形化安装
  11. SCOM 2012知识分享-15:监视管理组运行状况
  12. 实用hostname查看主机名的步骤
  13. Spark 基础 —— sc.broadcast
  14. 例3.4 二叉树遍历 - 九度教程第32题(二叉树)
  15. Matlab R2016b简体中文版安装教程(附Matlab R2016b百度网盘下载地址)
  16. 手机文档转html,手机金山文档怎么转换成Word文档电脑手机?
  17. 2020.7.25 PAT甲级7-2 The Judger (25分)
  18. gnutls_handshake() failed: A TLS packet with unexpected length was received
  19. 移植Opencv到arm tq2440
  20. 左移赋值运算符 (<<=)

热门文章

  1. Spring MVC GET 从客户端数据到服务器端的乱码和服务器端数据到客户端的乱码
  2. rabbitmy实战
  3. PHPExcel开发者文档[中文版]
  4. 开源项目PullToRefresh详解(一)——PullToRefreshListView
  5. 以远程桌面访问Windows Azure虚拟机(转+译)
  6. 我的2009:心智成长篇
  7. 妙用SQL Server聚合函数和子查询迭代求和
  8. FastDFS 集群配置(转载)
  9. 返回一个整数数组中最大子数组的和
  10. bzoj 1207: [HNOI2004]打鼹鼠