String 字符串拼接问题,到底什么时候会走 StringBuilder?

本文深入探讨了Java中字符串拼接的两种不同场景,一种情况是编译器无法优化,会使用StringBuilder进行拼接;另一种情况编译器能直接优化,避免了额外的拼接操作。文章通过具体案例解析了这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:jianshu.com/p/a80c9b2b89cd

  • 前言

  • 一.问题

    • 案例1

    • 案例2

  • 二.探究问题

  • 三.总结


前言

最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看demo

一.问题

案例1

640?wx_fmt=png
测试代码1.png

可以发现,str == str2的结果为false,那么我们在看看下一个例子。

案例2

640?wx_fmt=png
测试代码2.png

这时候,两个字符串对比的结果为true。

二.探究问题

这时候,疑问就来了,为什么结果会不一致呢?利用在cmd窗口输入javap -c TestDemo.class命令,对字节码文件进行反编译,发现了问题所在?

640?wx_fmt=png
测试代码1cmd.png

可以看到在案例1中,java代码底层走了StringBuilder,进行字符串拼接,然后调用了StringBuilder的toString方法。

640?wx_fmt=png
测试代码2cmd.png

而案例2中,对class文件进行反编译,发现代码出现了一点变化,并没有走StringBuilder进行字符串拼接。

三.总结

  1. 案例1中,通过变量和字符串拼接,java是需要先到内存找变量对应的值,才能进行完成字符串拼接的工作,这种方式java编译器没法优化,只能走StringBuilder进行拼接字符串,然后调用toString方法,当然返回的结果和常量池中的111这个字符串的内存地址是不一样的,因此结果为false。

  2. 案例2中,直接在表达式里写值,java不用根据变量去内存里找对应的值,可以在编译的时候直接对这个表达式进行优化,优化后的表达式从 "111" + "" 直接变成了 "111" ,两个String类型的变量都指向了常量池的111字符串,因此结果为true;

640?wx_fmt=png

如果你喜欢这篇文章,喜欢,转发。

生活很美好,明天见(。・ω・。)ノ♡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值