字符串拼接,什么时候会走StringBuilder?

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

Good friends are like stars. You don’t always see them, but you know they’re always there. 

好朋友就像是星星。你不一定总是能见到他们,但你知道,他们会一直在那里。

每日掏心

生活是开水,不论冷热,只要适合的温度,生活是口味,不论酸甜苦辣,只要适合的口感,就是最好。

来自:叫我不矜持 | 责编:乐乐

链接:jianshu.com/p/a80c9b2b89cd

程序员小乐(ID:study_tech)第 935 次推文  图源:百度

往日回顾:面试官问我:Java反射是什么?我回答竟然不上来......

     

   正文   

前言

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

一.问题

案例1

测试代码1.png

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

案例2

测试代码2.png

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

二.探究问题

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

测试代码1cmd.png

可以看到在案例1中,java代码底层走了StringBuilder,进行字符串拼接,然后调用了StringBuilder的toString方法。关注公众号程序员小乐回复关键字“offer”获取算法面试题和答案。

测试代码2cmd.png

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

三.总结

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

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

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。欢迎加入程序员小乐技术交流群,在后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

Spring Boot 最最最常用的注解梳理

MySQL中,当update修改数据与原数据相同时会再次执行吗?

关注订阅号「程序员小乐」,收看更多精彩内容

嘿,你在看吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值