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

相关推荐
扯淡的闲人7 分钟前
多语言编码Agent解决方案(2)-后端服务实现
开发语言·python·深度学习
烦躁的大鼻嘎27 分钟前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
野生的编程萌新30 分钟前
【C++深学日志】C++编程利器:缺省参数、函数重载、引用详解
c语言·开发语言·c++
緈諨の約錠31 分钟前
JVM基础篇以及JVM内存泄漏诊断与分析
java·jvm
Slaughter信仰33 分钟前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
java·开发语言·jvm
Java进阶笔记35 分钟前
JVM默认栈大小
java·jvm·后端
shan&cen1 小时前
Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
java·数据结构·算法
在线教学养猪1 小时前
Spring Task
java·后端·spring
_hermit:1 小时前
【从零开始java学习|小结】记录学习和编程中的问题
java·学习
小柯J桑_1 小时前
C++之特殊类设计
java·开发语言·c++