字符串相加的底层实现
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中也会有这样的优化提示
可是还有一种特殊情况推荐使用StringBuilder,就是在循环中使用+拼接,因为在循环中的每一次拼接操作都会新创建一个StringBuilder对象,下一次进入循环再次新创建,就会造成大量的无用StringBuilder创建,因此还是更推荐在循环外显式创建StringBuilder,内部使用其append()拼接
有关这点,可以去看看这位大佬的博客,有更详细的举例解释
可以看到为了java为了应对String不可变性产生的代价:每次拼接都会生成新String
对象,频繁操作可能产生内存开销。
还是采用了很多手段来进行优化弥补,包括串池机制和StringBuilder,都是为了防止生成过多的String对象
#java#记录fengdongnan的知识产出文档,欢迎大家来一起交流学习