关于堆栈的内容网上已经有很多资料了,这是我找的加上自己理解的一篇说明文:

一、内存区域类型

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制;

1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);

2. 堆:存放所有new出来的对象;

3. 静态域:存放静态成员(static定义的);

4. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 ;

5. 非RAM存储:硬盘等永久存储空间

二、栈中放的东西,图示:

三、堆存放示意图:

对于String类的对象特别说明一下:

四、按值传入还是引用传入

理解了堆栈数据存储,再来理解一下值传递和引用传递的概念;

1、基本类型:

经过了痛苦的手术后,发现自己还是个男的,这是为啥?换个写法你就懂了:

懂了吧,传给change()方法的参数值由boy传递,传完就由girl这个变量来处理了,手术期间的那个值是girl这个变量的值,手术前后的那个值是boy的。这个过程可以用一个故事总结一下:一个男人不想做男人了,准备做手术换个性别,于是打电话给快递小哥(变量boy)把他送到医院手术台上,快递小哥见到医生后,把那个男的交给了会变性的医生(方法change()),快递小哥就走了(快递小哥还是快递小哥),医生开始工作,把他的性别变成女的(girl="女"),那个男的确实手术成功了,只是我们打印的变性后的属性是快递小哥的。故事结束,完美!

2、引用传值

引用要这样来理解:它是一根绳子,它系着一个球(对象),但它不是球(对象),我们想找到球(对象),就得先找对应的绳子。

看栗子:

输出的结果是什么?

18

为啥是这个结果,还是来说个故事,你同学给你介绍对象,说这姑娘白白嫩嫩,漂亮地一塌糊涂,你说好呀好呀,那她多大呀?你同学是马大哈,记不得年龄,就跟你说20岁(user.setAge("20")),然后你说确定吗?我才19岁,年龄大的一概不考虑,于是你同学就去找她的年龄(public void getGirlAge(User user)),得到了年龄并把这个年龄保存在大脑中(user.setAge("18")),然后打电话跟你说的时候,把年龄的信息从大脑里拿出来(user.getAge()),18岁是你可以接受的年龄,于是你们就安排见面了...再一次,完美。

那再加个东西,你们看看:

这里输出的值是20,看来对象是谈不成了,这过程中到底发生了什么呢?原来是你的同学找那个姑娘的年龄的时候,发现那个姑娘把你同学拉黑了,你同学好面子,还是得给你介绍,于是又找了一个新的姑娘(user=new User();),还把年龄设成了18岁,你等啊等,等了半年也没等到,于是你开始着急了,想知道这个姑娘的年龄到底是多少,于是打印输出姑娘年龄,可是这个姑娘还是第一个姑娘(你也根本就不知道还有第二个姑娘),得到的就是20,年龄虽然比你大一点,可是半年时间,你也想清楚了,年龄大一点体贴也挺好。于是。。。好了,依然完美!

就扯这么多,堆栈中放的东西都是固定的,大家记忆一下就好,很简单的。

JAVA堆里放啥,栈里放啥,一看就懂相关推荐

  1. Java堆溢出,虚拟机栈和本地方法栈溢出

    Java堆溢出 JVM运行时分区的堆区是占比最大的,它用来存储对象的,每当我们new一个对象,而且要保证这个对象到GC Roots 那些对象是有路径可达的(不可达就有很大可能性被清除),那么当对象的数 ...

  2. 模拟JAVA堆内存溢出和栈内存溢出

    文章目录 1. 模拟堆内存溢出 2. 模拟栈内存溢出 1. 模拟堆内存溢出 为了更快的出现堆内存溢出,可以限制Java堆的大小为10MB(不限制也可以).代码如下(可直接复制使用): package ...

  3. java堆内存和堆外内存_Java堆空间,本机堆和内存问题

    java堆内存和堆外内存 最近,我正在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多. 代码创建的所有Java对象都是在Java堆空间内创建的,其大小由-Xmx选项定义. ...

  4. Java堆空间,本机堆和内存问题

    最近,我在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多. 代码创建的所有Java对象都是在Java堆空间内创建的,其大小由-Xmx选项定义. 但是一个Java进程由很多 ...

  5. java堆空间(内存)

    当Java程序开始运行时,JVM会从操作系统获取一些内存.JVM使用这些内存,这些内存的一部分就是堆内存.堆内存通常在存储地址的底层,向上排列.当一个对象通过new关键字或通过其他方式创建后,对象从堆 ...

  6. C、C++和C#的关系,以“把大象放进冰箱里”举例

    最近得用unity做虚拟仿真相关的东西,当然,它的知名还是在游戏界,像王者荣耀就是使用 unity 开发的. 使用unity就要学习C#语言,我一直以为C#是C++的升级版本,因为C++是C的改进版, ...

  7. 看我们如何“把大象放进冰箱里”

    一.数学家的办法 转自MITBBS 把大象放到冰箱里的分析学方法 1)先把大象微分,然后把它放到冰箱里,再在冰箱里把它积分. 2)重新定义冰箱或者大象的测度(如Radon测度). 3)用Banach- ...

  8. 微云存照片会变模糊吗_QQ相册里的照片,为什么放一段时间就会变模糊?今天可算知道了...

    大家好,我是每天分享生活小趣闻的沙拉.祝大家新年好,最近天气越来越冷要注意添衣哦,不然冻着了沙拉会伤心的.本期是给大家普及一些关于"QQ相册里的照片,为什么放一段时间就会变模糊?" ...

  9. 灯泡里的钨丝是怎么放进去的,这个视频解开我20多年的疑惑!

    全世界只有3.14 % 的人关注了 数据与算法之美 白炽灯渐渐从我们的视线里消失了,不得不说这个一个伟大的发明,试想一下要是没有灯,只点蜡烛会有多少人抓狂,那么你知道灯泡里的钨丝是怎么放进去的吗,这个 ...

  10. LeetCode 1580. 把箱子放进仓库里 II(排序)

    文章目录 1. 题目 2. 解题 1. 题目 给定两个正整数数组 boxes 和 warehouse ,分别包含单位宽度的箱子的高度,以及仓库中n个房间各自的高度. 仓库的房间分别从0 到 n - 1 ...

最新文章

  1. cluster maintain manager Software群集管理软件
  2. 上周新闻回顾:微软补了又漏 思科自找对手
  3. web版本 开源压测工具_标星 1.3K 的 Web 框架压测库,助你更好的选择框架
  4. swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
  5. hdu 1003 A + B Problem II 使用整型数组轻松实现大数求和
  6. ORACLE会话以及SQL执行信息查询
  7. 新独立版抖音口红机全修复版本附视频教程
  8. java mysql 连接测试_java连接mysql数据库及测试是否连接成功的方法
  9. 数据挖掘:模型选择——集成算法与树模型
  10. 浅谈Java、Python、C++、PHP、JavaScript5大编程语言该如何选择
  11. 硬件FFT加速模块的应用
  12. ChartCube - 图表魔方:阿里出品的免费在线图表制作工具,简单好用还漂亮
  13. 安全管理实务之一:补丁管理(转)
  14. 代码随想录第十一天 LeetCode 20、1047、150(栈)
  15. python按enter退出_【cmd按任意键退出 python】
  16. 201812CCF-CCSP竞赛:第1题-小明上学
  17. Python人脸图像特征提取方法
  18. web前段学习 第二部分
  19. 小程序获取openid和unionid服务号获取unionid服务号消息推送
  20. php引用中国联通M2M接口

热门文章

  1. Typora+坚果云实现笔记云同步,真的很nice!
  2. flot.js ajax,jquery.flot.js简单绘制折线图用法示例
  3. 超声检测的A扫描、B扫描、C扫描
  4. 解决font icon图标的对齐问题
  5. 23.2.28 Staffing System
  6. 噪声的频谱分析的重要意义_频谱分析仪的作用以及原理分析
  7. Vue框架的学习(Vue的基础指令操作二 V-For)第二课
  8. Android 各个Support Library介绍
  9. 2021年茶艺师(高级)考试题及茶艺师(高级)找解析
  10. 统一资源定位符URL的简单了解