常看常新
常量字符串拼接
String s = "a" + "b" + "c";//编译优化,直接就是 "abc"
System.out.println(s);
会复用串池的字符串
拼接有变量字符串
String s1 = "a";
String s2 = s1 + "b";
String s3 = s2 + "c";
System.out.println(s3);
JDK8以前
底层使用
StringBuilder
拼接每一步拼接都会创建新的
StringBuilder
,调用append
方法,然后调用toString()
方法,创建一个字符串对象。每一次拼接都创建两个对象,开销比较大
JDK8
String s1 = "a";
String s2 = "b";
String s3 = "c";
String s4 = s1 + s2 + s3;
System.out.println(s4);
- 先预估字符串的长度,创建字符数组,产生一个新的字符串
- 预估也需要时间,多次加仍然比较慢
结论
多次拼接手动使用StringBuilder
StringBuilder扩展底层原理
无参构造
- 创建时默认容量16,字节数组
- 添加的内容小于16,直接存
- 添加的内容大于16,扩容到(原来容量*2+2=34)
- 一次加的太多,扩容之后还不够,以实际长度为准
有参构造
- 创建时默认容量为
len + 16