String 拼接那些事儿
总结建议
线程安全用StringBuffer;
一般情况用 StringBuilder ;
字符串拼接,通过特定字符分割用StringJoiner ;
String 类型 ,+ 号拼接
String str1 = "a";
str1 = str1 + "b";
// 编译后在系统类似于:
// StringBuilder stringBuilder = new StringBuilder();
// stringBuilder.append(str1)
// stringBuilder.append("b")
// stringBuilder.toString();
String 类型 ,append拼接
String str2 = "a";
str2 = str2.concat("b");
// 源码实现:
// System.arraycopy ---native方法,深拷贝(注意:复杂对象,对象里面的对象是指针)
// 具体实现 1. 新开辟 char[] , 2. copy 源,3. copy 目标,4. 返回
StringBuffer 拼接
StringBuffer str3 = new StringBuffer("a");
str3 = str3.append("b");
// 源码注意点:
// 新创建,length 预留+16
// 长度若超过,扩容当前长度*2+2,若还不够,用需要的长度赋值
// 若为NULL,拼接 "null"
// synchronized 的存在,保证了线程安全
StringBuilder 拼接
StringBuilder str3 = new StringBuilder ("a");
str3 = str3.append("b");
// 类似StringBuffer ,但是没有加synchronized ,非线程安全
StringJoiner 拼接
StringJoiner str5 = new StringJoiner("-", "start", "end");
str5.add("a");
str5.add("b");
// 内部用的还是 StringBuilder
// 使用场景 用某个分隔符拼接字符串,可以添加前后缀
Collectors.joining 拼接
List<String> list = Arrays.asList("A", "B", "C", "D", "[", "]");
String str6 = list.stream().collect(Collectors.joining(";", "prefix", "suffix"));
// 内部用的还是 StringJoiner