当前位置:网站首页>字符串常量与字符串对象分配内存时的区别
字符串常量与字符串对象分配内存时的区别
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
好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!
注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受
边栏推荐
- C语言面试 写一个函数查找两个字符串中的第一个公共字符串
- cf:C. Column Swapping【排序 + 模擬】
- Three updates to build applications for different types of devices | 2022 i/o key review
- [FPGA tutorial case 13] design and implementation of CIC filter based on vivado core
- 基本Dos命令
- The boss always asks me about my progress. Don't you trust me? (what do you think)
- Markdown displays pictures side by side
- 基于FPGA的VGA协议实现
- 当我们谈论不可变基础设施时,我们在谈论什么
- [SOC FPGA] peripheral PIO button lights up
猜你喜欢
[SOC FPGA] custom IP PWM breathing lamp
高并发大流量秒杀方案思路
go-microservice-simple(2) go-Probuffer
ETCD数据库源码分析——从raftNode的start函数说起
Apple CMS V10 template /mxone Pro adaptive film and television website template
jvm命令之 jcmd:多功能命令行
Peripheral driver library development notes 43: GPIO simulation SPI driver
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
Chain storage of stack
VScode进行代码补全
随机推荐
C note 13
Markdown 并排显示图片
Apple CMS V10 template /mxone Pro adaptive film and television website template
深度聚类:将深度表示学习和聚类联合优化
直击2022ECDC萤石云开发者大会:携手千百行业加速智能升级
[SOC FPGA] custom IP PWM breathing lamp
安装mongodb数据库
那些自损八百的甲方要求
[SOC FPGA] peripheral PIO button lights up
rt-thread 中对 hardfault 的处理
Personal imitation SSM framework
The solution of a simple algebraic problem
Value range of various datetimes in SQL Server 2008
[SQL practice] a SQL statistics of epidemic distribution across the country
Storage of dental stem cells (to be continued)
生活中的开销,怎么记账合适
Say sqlyog deceived me!
Oracle迁移中关于大容量表使用数据泵(expdp、impdp)导出导入容易出现的问题和注意事项
10W word segmentation searches per second, the product manager raised another demand!!! (Collection)
牛客小白月赛52 E.分组求对数和(二分&容斥)