精选文章 面试:字符串拼接,什么时候用StringBuilder?

面试:字符串拼接,什么时候用StringBuilder?

作者:程序猿DD_ 时间: 2020-07-26 10:01:00
程序猿DD_ 2020-07-26 10:01:00

点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

面试:字符串拼接,什么时候用StringBuilder?1

来源 | www.jianshu.com/p/a80c9b2b89cd

前言

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

一.问题

案例1

面试:字符串拼接,什么时候用StringBuilder?2

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

案例2

面试:字符串拼接,什么时候用StringBuilder?3

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

二.探究问题

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

面试:字符串拼接,什么时候用StringBuilder?4

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

面试:字符串拼接,什么时候用StringBuilder?5

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

三.总结

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

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

往期推荐

Redis 6.0 除了多线程,别忘了这个牛逼特性!

企业服务内部接口校验方案

JDK 14 里的调试神器了解一下?

谷歌 Java 编程风格指南

有理有据:一篇来自前端同学对后端接口的吐槽!

关注下方公众号,回复“2020面试

免费获取2020年最新面试题

面试:字符串拼接,什么时候用StringBuilder?6

一起进大厂,每日学干货

关注它,不迷路

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

您可能感兴趣

  • C++基础知识(四)-友元和运算符重载

    整理码字不易,养成好习惯,点赞关注,你的支持就是我写下去的动力,谢谢老板。 本文为C++第三篇后续接着这篇文章写,大家可以持续关注,前三篇在主页 4.5 友元 类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有成员,怎么办? 解决方法是使用友元函数,友元函数是一种特权函数,c++允许这个特权函数访问私有成员。这一点从现实生活中也...

  • python学习001

    前言: 1、运维/网络为什么要学习编程? (1)运维/网络中所有已学的命令其实都是已经编制好的程序,创造命令就是编写程序; (2)在云计算领域中,繁琐的命令配置已经不能满足日常需求,深入发展是需要贴近业务/研发的,因此就要能够创造命令/编写程序/开发; (3)网络安全领域中,可以深入理解渗透、攻防等细节,Kali-Linux ,SDN(命令对应网络)夯实技术; (4)对于校招而言,大型互联网...

  • 阿里面试,208道Java高频题首发,拿下高薪offer不是梦

    Java 基础 1. JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗? 4. final 在 Java 中有什么作用? 5. Java 中的 Math. round(-1. 5) 等于多少? 6. String 属于基础的数据类型吗? 7. Java 中操作字符串都有...

  • 基础知识二

    重载(Overload)和重写的区别.重载的方法能否根据返回类型进行区分. 重载:在同一个类中,方法名相同,参数列表不同(参数类型不同,参数个数不同或者两者都不同),就是重载,重载对返回类型没有特殊要求,也就是说重载的方法不能根据返回类型进行区分. 重载的规则: 1)、必须具有不同的参数列表; 2)、可以有不同的返回类型,只要参数列表不同就可以了; 3)、可以有不同的访问修饰符; 4)、可以...

  • Java面试题全集(上)33 - 64

    原帖:https://blog.csdn.net/jackfrued/article/details/44921941 个人认为原帖的排版不太好,所以复制过来重新排下版,有少量的修改 本帖主要是给自己看的,有不懂的地方可以看下原帖 33、一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以,但一个源文件中最多只能有一个 public 类且文件名必须和公开类的类名完全...

  • .NET实现大文件上传

    最近遇见一个需要上传超大大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表格数据、上传影音文件等。如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心等待请求完成。 下面从文件上传方式入手,整...

  • 学计算机必看:程序员部落酋长,给计算机专业学生的 6 个建议!

    如果你喜欢编程,那么你真是受到了上天的眷顾。你是非常幸运的少数人之一,能够以自己喜欢的事谋生。大多数人没有这么幸运。你认为理所当然的观念“热爱你的工作”,其实是一个很现代的概念。通常的看法是,工作是一种让人很不开心的事,你为了拿工资才不得不去上班。 你工作的目的是为了攒下钱去干那些自己真正喜欢干的事,但是前提是你得等到65岁退休之后才行,而且还有不少条件。条件一,你的积蓄必须足够多;条件二,...

  • Python 的单元测试框架(一):unittest

    前言 说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest。 的确,作为 Python 的标准库,它很优秀,并被广泛用于各个项目。但你知道吗?其实在 Python 众多项目中,主流的单元测试框架远不止这一个。 本系列文章将为大家介绍目前流行的 Python 的单元测试框架,讲讲它们的功能和特点并比较其异同,以让大家在面对不同场景、不同需...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。