[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。

相关推荐
无限的鲜花5 小时前
反射(原创推荐)
java·开发语言
IT二叔5 小时前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
yongche_shi5 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he5 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
超级数据查看器6 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
AI行业学习7 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
折哥的程序人生 · 物流技术专研7 小时前
《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
java·面试题·java进阶·blockingqueue·并发容器·集合源码·java100天进阶
ai_coder_ai7 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化
大圣编程7 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
killerbasd7 小时前
总结 7.04
jvm