Java 字符串拼接原理

常看常新

常量字符串拼接

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
img_show