[JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别

文章目录

0、前情

为什么str1== str2 就返回true,而str1==str3 就返回false?先看内存图解释

1、相同之处

String str1=new String("yhz")和String str2="yhz",都会先去字符串常量池中查看是否已经存在"yhz",如果存在则直接使用,如果不存在则会在字符串常量池中创建"yhz"。

2、不同之处

String str1 = new String("yhz") 还会通过 new String() 在堆里创建并初始化一个value为字符串常量池中"yhz"实例的地址的字符串对象,并将该将对象的地址复制给str1,然后创建一个引用。

String str1 = new String("yhz") 可能会创建一个或两个对象:

当字符串常量池中已经有 "yhz"时,则会创建一个对象

如果字符串常量池中没有"yhz",则会创建两个对象:

先在字符串常量池中,创建一个字面量"yhz"所对应的实例。

再通过new String("yhz")在堆中创建一个value为字符串常量池中"yhz"实例的地址的字符串对象,并将new出来的地址返回给str1。
String str2 = "yhz";可能会创建0个或1个对象:

当字符串常量池中,有"yhz"这个实例时,创建0个,直接将"yhz"实例的地址返回给str2

当字符串常量池中,没有"yhz"这个实例时,会在常量池中创建一个"yhz"实例,并将实例的地址返回给str2。

3、解释前情

str1==str2 返回true: 如果字符串常量池中没有"hello",那么当执行String str1="hello"时,会在字符串常量池中创建一个"hello"实例,并将"hello"实例的地址返回给str1。当执行String str2 = "hello" 时,会去字符串常量池中查看有没有"hello",由于前面"hello"已经被创建,则将字符串常量池中"hello"实例的地址返回给str2。也就是说str1和str2指向的是同一个内存地址。我们知道,在Java中,= = 运算符比较的是两个变量所指向的对象内存地址是否相同,相同为true,不同则为false。所以str1 == str2 返回 true。

str1==str3 返回 false: 执行到String str3 = new String("hello") 时,会先去字符串常量池中看是否有"hello"实例 ,由于之前已经创建了,所以直接去堆中开辟一块空间,创建一个value为字符串常量池中"hello"实例的地址的字符串对象,并将在堆中new出来的对象的地址返回给str3。此时,str1指向字符串常量池中的"hello",str3 指向堆中刚new 出来的对象,由于指向的对象内存地址不同,所以返回false。

相关推荐
JIngJaneIL4 分钟前
篮球论坛|基于SprinBoot+vue的篮球论坛系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·篮球论坛系统
毕设源码-赖学姐12 分钟前
【开题答辩全过程】以 安卓的服装销售APP为例,包含答辩的问题和答案
java·eclipse·tomcat
沐知全栈开发1 小时前
Python3 集合
开发语言
青云交1 小时前
Java 大视界 -- Java 大数据在智能农业温室环境调控与作物生长模型构建中的应用
java·机器学习·传感器技术·数据处理·作物生长模型·智能农业·温室环境调控
曾经的三心草1 小时前
SpringAI5-智能聊天机器⼈
java·springai
微露清风1 小时前
系统性学习C++-第八讲-vector类
java·c++·学习
Jonathan Star2 小时前
用Python轻松提取视频音频并去除静音片段
开发语言·python·音视频
Evand J2 小时前
【自适应粒子滤波MATLAB例程】Sage Husa自适应粒子滤波,用于克服初始Q和R不准确的问题,一维非线性滤波。附下载链接
开发语言·matlab·卡尔曼滤波·自适应滤波·非线性
roykingw2 小时前
【思想比实现更重要】高并发场景下如何保证接口幂等性
java·web安全·面试
hd51cc2 小时前
C++ 类的学习(四) 继承
开发语言·c++·学习