当前位置:网站首页>字符串常量与字符串对象分配内存时的区别
字符串常量与字符串对象分配内存时的区别
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
好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!
注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受
边栏推荐
- You don't know the complete collection of recruitment slang of Internet companies
- 蚂蚁庄园安全头盔 7.8蚂蚁庄园答案
- Crudini 配置文件编辑工具
- Test the foundation of development, and teach you to prepare for a fully functional web platform environment
- Qt多线程的多种方法之一 QThread
- DC-7靶机
- go-microservice-simple(2) go-Probuffer
- Redis(一)——初识Redis
- Markdown displays pictures side by side
- 你不知道的互联网公司招聘黑话大全
猜你喜欢
A freshman's summary of an ordinary student [I don't know whether we are stupid or crazy, but I know to run forward all the way]
JMeter's own functions are not enough? Why don't you develop one yourself
Say sqlyog deceived me!
693. 行程排序
10W word segmentation searches per second, the product manager raised another demand!!! (Collection)
JVM命令之 jstat:查看JVM統計信息
Introduction to the extension implementation of SAP Spartacus checkout process
【GNN】图解GNN: A gentle introduction(含视频)
Jcmd of JVM command: multifunctional command line
Rk3399 platform development series explanation (WiFi) 5.53, hostapd (WiFi AP mode) configuration file description
随机推荐
Jcmd of JVM command: multifunctional command line
New Year Fireworks code plus copy, are you sure you don't want to have a look
Party A's requirements for those who have lost 800 yuan
K8s running Oracle
The solution of a simple algebraic problem
Array proof during st table preprocessing
@pathvariable 和 @Requestparam的详细区别
VMware安装后打开就蓝屏
进程间通信之共享内存
Developers don't miss it! Oar hacker marathon phase III chain oar track registration opens
C. colonne Swapping [tri + Simulation]
[FPGA tutorial case 13] design and implementation of CIC filter based on vivado core
Personal imitation SSM framework
A very good JVM interview question article (74 questions and answers)
10W word segmentation searches per second, the product manager raised another demand!!! (Collection)
Cloud acceleration helps you effectively solve attack problems!
CTFshow--常用姿势
CMD permanently delete specified folders and files
Jstat pour la commande JVM: voir les statistiques JVM
Go language learning notes - Gorm use - Gorm processing errors | web framework gin (10)