JAVA堆里放啥,栈里放啥,一看就懂
关于堆栈的内容网上已经有很多资料了,这是我找的加上自己理解的一篇说明文:
一、内存区域类型
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堆里放啥,栈里放啥,一看就懂相关推荐
- Java堆溢出,虚拟机栈和本地方法栈溢出
Java堆溢出 JVM运行时分区的堆区是占比最大的,它用来存储对象的,每当我们new一个对象,而且要保证这个对象到GC Roots 那些对象是有路径可达的(不可达就有很大可能性被清除),那么当对象的数 ...
- 模拟JAVA堆内存溢出和栈内存溢出
文章目录 1. 模拟堆内存溢出 2. 模拟栈内存溢出 1. 模拟堆内存溢出 为了更快的出现堆内存溢出,可以限制Java堆的大小为10MB(不限制也可以).代码如下(可直接复制使用): package ...
- java堆内存和堆外内存_Java堆空间,本机堆和内存问题
java堆内存和堆外内存 最近,我正在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多. 代码创建的所有Java对象都是在Java堆空间内创建的,其大小由-Xmx选项定义. ...
- Java堆空间,本机堆和内存问题
最近,我在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多. 代码创建的所有Java对象都是在Java堆空间内创建的,其大小由-Xmx选项定义. 但是一个Java进程由很多 ...
- java堆空间(内存)
当Java程序开始运行时,JVM会从操作系统获取一些内存.JVM使用这些内存,这些内存的一部分就是堆内存.堆内存通常在存储地址的底层,向上排列.当一个对象通过new关键字或通过其他方式创建后,对象从堆 ...
- C、C++和C#的关系,以“把大象放进冰箱里”举例
最近得用unity做虚拟仿真相关的东西,当然,它的知名还是在游戏界,像王者荣耀就是使用 unity 开发的. 使用unity就要学习C#语言,我一直以为C#是C++的升级版本,因为C++是C的改进版, ...
- 看我们如何“把大象放进冰箱里”
一.数学家的办法 转自MITBBS 把大象放到冰箱里的分析学方法 1)先把大象微分,然后把它放到冰箱里,再在冰箱里把它积分. 2)重新定义冰箱或者大象的测度(如Radon测度). 3)用Banach- ...
- 微云存照片会变模糊吗_QQ相册里的照片,为什么放一段时间就会变模糊?今天可算知道了...
大家好,我是每天分享生活小趣闻的沙拉.祝大家新年好,最近天气越来越冷要注意添衣哦,不然冻着了沙拉会伤心的.本期是给大家普及一些关于"QQ相册里的照片,为什么放一段时间就会变模糊?" ...
- 灯泡里的钨丝是怎么放进去的,这个视频解开我20多年的疑惑!
全世界只有3.14 % 的人关注了 数据与算法之美 白炽灯渐渐从我们的视线里消失了,不得不说这个一个伟大的发明,试想一下要是没有灯,只点蜡烛会有多少人抓狂,那么你知道灯泡里的钨丝是怎么放进去的吗,这个 ...
- LeetCode 1580. 把箱子放进仓库里 II(排序)
文章目录 1. 题目 2. 解题 1. 题目 给定两个正整数数组 boxes 和 warehouse ,分别包含单位宽度的箱子的高度,以及仓库中n个房间各自的高度. 仓库的房间分别从0 到 n - 1 ...
最新文章
- cluster maintain manager Software群集管理软件
- 上周新闻回顾:微软补了又漏 思科自找对手
- web版本 开源压测工具_标星 1.3K 的 Web 框架压测库,助你更好的选择框架
- swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
- hdu 1003 A + B Problem II 使用整型数组轻松实现大数求和
- ORACLE会话以及SQL执行信息查询
- 新独立版抖音口红机全修复版本附视频教程
- java mysql 连接测试_java连接mysql数据库及测试是否连接成功的方法
- 数据挖掘:模型选择——集成算法与树模型
- 浅谈Java、Python、C++、PHP、JavaScript5大编程语言该如何选择
- 硬件FFT加速模块的应用
- ChartCube - 图表魔方:阿里出品的免费在线图表制作工具,简单好用还漂亮
- 安全管理实务之一:补丁管理(转)
- 代码随想录第十一天 LeetCode 20、1047、150(栈)
- python按enter退出_【cmd按任意键退出 python】
- 201812CCF-CCSP竞赛:第1题-小明上学
- Python人脸图像特征提取方法
- web前段学习 第二部分
- 小程序获取openid和unionid服务号获取unionid服务号消息推送
- php引用中国联通M2M接口
热门文章
- Typora+坚果云实现笔记云同步,真的很nice!
- flot.js ajax,jquery.flot.js简单绘制折线图用法示例
- 超声检测的A扫描、B扫描、C扫描
- 解决font icon图标的对齐问题
- 23.2.28 Staffing System
- 噪声的频谱分析的重要意义_频谱分析仪的作用以及原理分析
- Vue框架的学习(Vue的基础指令操作二 V-For)第二课
- Android 各个Support Library介绍
- 2021年茶艺师(高级)考试题及茶艺师(高级)找解析
- 统一资源定位符URL的简单了解