当前位置:网站首页>字符串常量与字符串对象分配内存时的区别
字符串常量与字符串对象分配内存时的区别
2022-07-07 01:41:00 【裴南苇_】
目录
引出问题
在理解这两个的区别之前,我们先看一段代码
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);
String s3 = s2.intern();
System.out.println(s2 == s3);
}
如果你对上面的2个输出有所疑惑的话,看完这篇文章,相信你会有所收获。
理解内存分布
我们先来理解一下字符串常量和字符串变量以及他们对象的创建过程,相信会方便你理解上面的比较。
字符串常量:是放在字符串常量池里的,在代码里也就是"abc"
字符串对象:是一个对象,是放在堆里的,在代码里也就是"new String("abc")"
接下来是他们在内存中的分布

解释分析:
内存分布解析
String s1 = new String("abc")
首先在栈中开辟一个地址s1存放堆中new String("abc")的地址,然后new这个String的对象。在new这个对象的时候,要先去判断字符串常量池中是否有"abc"这个常量。如果有,直接在对象中存储这个常量的地址。如果没有,则需要去常量池中先创建这个常量,再将这个常量的内存存储到对象中。
String s2 = "abc"
首先在栈中开辟一个地址s2,存放即将存放的常量的地址。依旧是先去常量池中去判断是否存在这个常量,不同的是,这次放入的是直接存入栈中的s1引用。
String s3 = s2.intern()
引用创建如上文,String对象的intern方法,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
结果分析
比较s1 和 s2时,由于s1的对象是new出来的,所以存在堆中。而s2存储的地址是处于字符常量池中的方法区中,所以比较s1和s2的地址比较,必然是false;
比较s2 和 s3时,由于s3是由s2.intern()得来,intern我们已经知道是直接返回的常量的引用。所以s2和s3的存储的地址是一样的,固然返回true
好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!
注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受
边栏推荐
- 安装VMmare时候提示hyper-v / device defender 侧通道安全性
- VMware安装后打开就蓝屏
- Jstat pour la commande JVM: voir les statistiques JVM
- You don't know the complete collection of recruitment slang of Internet companies
- Calculation model FPS
- Ctfshow-- common posture
- Chain storage of stack
- 改变ui组件原有样式
- 如何在Touch Designer 2022版中设置解决Leap Motion不识别的问题?
- Talking about reading excel with POI
猜你喜欢

测试开发基础,教你做一个完整功能的Web平台之环境准备

ML's shap: Based on the adult census income binary prediction data set (whether the predicted annual income exceeds 50K), use the shap decision diagram combined with the lightgbm model to realize the

LM小型可编程控制器软件(基于CoDeSys)笔记二十三:伺服电机运行(步进电机)相对坐标转换为绝对坐标

JVM command - jmap: export memory image file & memory usage

软件测试知识储备:关于「登录安全」的基础知识,你了解多少?

How to keep accounts of expenses in life
![[FPGA tutorial case 14] design and implementation of FIR filter based on vivado core](/img/fc/5162bbb0746f8af2d6c7d63ade571a.png)
[FPGA tutorial case 14] design and implementation of FIR filter based on vivado core

深度聚类:将深度表示学习和聚类联合优化
![Cf:c. column swapping [sort + simulate]](/img/0e/64d17980d3ec0051cdfb5fdb34e119.png)
Cf:c. column swapping [sort + simulate]

开发者别错过!飞桨黑客马拉松第三期链桨赛道报名开启
随机推荐
CMD permanently delete specified folders and files
How to set up in touch designer 2022 to solve the problem that leap motion is not recognized?
Deep clustering: joint optimization of depth representation learning and clustering
解决pod install报错:ffi is an incompatible architecture
软件测试知识储备:关于「登录安全」的基础知识,你了解多少?
Cf:c. column swapping [sort + simulate]
360织语发布7.0新品 为党政军、央国企打造专属“统一数字工作空间”
Vscode for code completion
postgresql 数据库 timescaledb 函数time_bucket_gapfill()报错解决及更换 license
Cloud acceleration helps you effectively solve attack problems!
一名普通学生的大一总结【不知我等是愚是狂,唯知一路向前奔驰】
ST表预处理时的数组证明
基于ADAU1452的DSP及DAC音频失真分析
Party A's requirements for those who have lost 800 yuan
cf:C. Column Swapping【排序 + 模擬】
jmeter 函数助手 — — 随机值、随机字符串、 固定值随机提取
Calculation model FPS
Check Point:企业部署零信任网络(ZTNA)的核心要素
JMeter's own functions are not enough? Why don't you develop one yourself
C language sorting (to be updated)