字符串相加的底层实现

java中对字符串相加有着特殊的处理机制,主要包括常量和变量两种拼接类型,下面对这两种拼接的底层机制做一个解析,以及另一个与StringBuilder使用相关的知识点

常量拼接

String s ="a" + "b";

编译时优化:

如果是常量拼接,那么编译器会进行编译优化,直接将常量字符串进行拼接处理,即在编译后,源代码等同:

String s ="ab";

再往后就是走串池机制,如果串池中存在"ab",则取出其引用,否则新创建一个"ab"放入串池,然后再取其引用地址

变量拼接

String s = a + b;//a,b为两个String变量

StringBuilder拼接:

当字符串变量相加,无法在编译时确定结果时,底层采用StringBuilder调用其append()进行拼接,即编译后等价

// 编译后等价于:
String s = new StringBuilder().append(a).append(b).toString();

有关+/StringBuilder

编码规范中,更推荐使用+来进行字符串拼接,

因为+操作底层已经优化为StringBuilder拼接优化性能,相比显式StringBuilder,+操作明显更加清晰易懂,所以在idea中也会有这样的优化提示

alt

可是还有一种特殊情况推荐使用StringBuilder,就是在循环中使用+拼接,因为在循环中的每一次拼接操作都会新创建一个StringBuilder对象,下一次进入循环再次新创建,就会造成大量的无用StringBuilder创建,因此还是更推荐在循环外显式创建StringBuilder,内部使用其append()拼接

有关这点,可以去看看这位大佬的博客,有更详细的举例解释

京东一面:为什么 IDEA 建议去掉 StringBuilder,而要使用 “+” 拼接字符串?_牛客网

可以看到为了java为了应对String不可变性产生的代价:每次拼接都会生成新String对象,频繁操作可能产生内存开销

还是采用了很多手段来进行优化弥补,包括串池机制StringBuilder,都是为了防止生成过多的String对象

#java#
fengdongnan的博客 文章被收录于专栏

记录fengdongnan的知识产出文档,欢迎大家来一起交流学习

全部评论
学到了
点赞 回复 分享
发布于 04-07 09:08 黑龙江
学到了
点赞 回复 分享
发布于 03-17 11:20 江西

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务