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

相关推荐
风生u13 小时前
activiti7 详解
java
玄同76513 小时前
我的 Trae Skill 实践|使用 UV 工具一键搭建 Python 项目开发环境
开发语言·人工智能·python·langchain·uv·trae·vibe coding
岁岁种桃花儿13 小时前
SpringCloud从入门到上天:Nacos做微服务注册中心(二)
java·spring cloud·微服务
Word码13 小时前
[C++语法] 继承 (用法详解)
java·jvm·c++
Yorlen_Zhang13 小时前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#
lxl130713 小时前
C++算法(1)双指针
开发语言·c++
TT哇13 小时前
【实习 】银行经理端两个核心功能的开发与修复(银行经理绑定逻辑修复和线下领取扫码功能开发)
java·vue.js
逝水如流年轻往返染尘13 小时前
Java中的数组
java
不绝19113 小时前
C#进阶:预处理指令/反射,Gettype,Typeof/关键类
开发语言·c#
无小道13 小时前
Qt-qrc机制简单介绍
开发语言·qt