当前位置:网站首页>解析字符串拼接的两种情况
解析字符串拼接的两种情况
2022-07-30 14:56:00 【SSS4362】
解析字符串拼接的两种情况
1 字符串字面量进行拼接
1.1 内容
1.1.1 例子
如String s1=“s”+“h”;String s2=“sh”;
1.1.2 分析过程
s1=“s”+"h"这个过程
a 在字符串常量池中先查看是否有已经开辟了s字符串和h字符串的空间
b 若没有则需要先在字符串常量池里面开辟字符串字面量s和字符串字面量h的空间
c 因为使用了+进行拼接,所以也会先去字符串常量池中查找里面是否已经存在sh这个字面量了,
d 我们这个时候发现里面并没有存在sh这个字符串,因此会去开辟一个属于sh字符串的空间,并把这个空间的地址赋值给了s1
s2="sh"这个过程
我们会先去字符串常量池中查找是否已经存在sh这个字符串,发现已经存在了这个字符串,那么我们这个时候只需要将"sh"这个字符串在字符串常量池中的内存地址赋值给s2就行
结论: s1==s2的结果为true
因为s1、s2指向的内存地址都相同,都指向的是在字符串常量池中的"sh"这个字符串开辟的空间
1.2 示例代码
package Work;
public class Test05 {
public static void main(String[] args) {
String s1="s"+"r";
String s2="sr";
System.out.println(s1==s2);
}
}
1.3 示例代码生成的字节码文件的反编译代码
package Work;
import java.io.PrintStream;
public class Test05
{
public Test05()
{
}
public static void main(String args[])
{
String s1 = "sr";
String s2 = "sr";
System.out.println(s1 == s2);
}
}
1.4 示例代码运行截图

2 字符串变量进行拼接
2.1 内容
a 如果是字符串变量进行拼接,这个时候就会new StringBuilder对象去进行拼接,
b 因为它并不知道你那个变量里面存放了多长的字符串,用字符串常量池去存储变量的会没有必要,因此为了节约空间,因此只要涉及到字符串变量与字符串字面量(能清楚的知道里面的值,如"12")的拼接操作本质上还是new了一个StringBuilder去进行拼接操作(append),
c 然后调用toString方法(本质还是new了一个String对象进行返回的)去返回String对象
2.2 示例代码
package Work;
public class Test05 {
public static void main(String[] args) {
String s1="s";
String s2=s1+"r";
String s3="sr";
System.out.println(s2==s3);
}
}
2.3 示例代码生成的字节码文件的反编译代码
package Work;
import java.io.PrintStream;
public class Test05
{
public Test05()
{
}
public static void main(String args[])
{
String s1 = "s";
String s2 = (new StringBuilder()).append(s1).append("r").toString();
String s3 = "sr";
System.out.println(s2 == s3);
}
}
2.3 示例代码运行截图

3 总结
3.1 只要涉及到字符串变量与字符串字面量进行拼接操作,那么它一定会new StringBuffer对象去进行拼接操作,然后调用StringBuffer对象里面的toString方法(实际上了new了一个String对象)去返回一个String类型的结果
3.1.1 StringBuffer的toString方法源码
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
3.2 如果是字符串字面量与字符串字面量进行拼接,那么还是去方法区的字符串常量池去开辟空间,进行==比较的话还是去看他们俩指向的字符串常量池的字符串的地址是否相同
边栏推荐
猜你喜欢

GUCCI、LV等奢侈品巨头如何布局元宇宙的,其他品牌应该跟上吗?

xxl-job源码解析(技术分享)

数据库-SQL

华为「天才少年」计划招募的博士们,迎来首秀!

我们公司用了 6 年的网关服务,动态路由、鉴权、限流等都有,稳的一批!

JVM performance tuning

Sentinel

B+树索引页大小是如何确定的?

The Prospects of the Metaverse and the Four Tracks

Huawei issues another summoning order for "Genius Boys"!He, who had given up an annual salary of 3.6 million, also made his debut
随机推荐
使用 TiUP 命令管理组件
JVM性能调优
How do luxury giants such as GUCCI and LV deploy the metaverse, should other brands keep up?
Placement Rules 使用文档
Example of video switching playback (video switching example) code
golang modules初始化项目
视频切换播放的例子(视频切换范例)代码
GUCCI、LV等奢侈品巨头如何布局元宇宙的,其他品牌应该跟上吗?
TiDB 工具适用场景
Our company has used gateway services for 6 years, dynamic routing, authentication, current limiting, etc., a stable batch!
瑞吉外卖项目实战Day02
针对 MySQL/InnoDB 刷盘调优
[Cloud native] Alibaba Cloud ARMS business real-time monitoring
微服务架构下的核心话题 (二):微服务架构的设计原则和核心话题
localhost with 127.0.0.1
Sleuth+Zipkin(可视化) 服务链路追踪
如何做好技术选型
HTTP缓存小结
GeoServer + openlayers
R中按照数字大小进行排序