StringBuilder 字符串拼接扩容
String str = a + b + c(a,b,c都是变量,非常量)
实际执行时,"+"操作是通过创建一个StringBuilder来操作的,即:
StringBuilder temp = new StringBuilder(); temp.append("a"); temp.append("b"); temp.append("c"); temp.toString();
StringBuilder初始容量是16个char,可以通过 temp.capacity()方法得到。
当字符长度超过16个字符会进行扩容。
public AbstractStringBuilder append(String str) { if (str == null) str = "null"; int len = str.length(); if (len == 0) return this; int newCount = count + len;//count-当前StringBuilder字符串的长度 if (newCount > value.length) expandCapacity(newCount); str.getChars(0, len, value, count); count = newCount; return this; }
void expandCapacity(int minimumCapacity) { int newCapacity = (value.length + 1) * 2; if (newCapacity < 0) { newCapacity = Integer.MAX_VALUE; } else if (minimumCapacity > newCapacity) { newCapacity = minimumCapacity; } value = Arrays.copyOf(value, newCapacity); }
每次扩容都会扩容到当前字符串的2倍长度。
多个字符串拼接
1. 小字符串多,大字符串只有一两个时
优先拼接小字符串,最后在拼接大字符串。
因为如果先拼接大字符串,则第一次扩容后的长度为count+len(大字符串长度)即minimumCapacity,且没有空闲空间。再次拼接小字符串即使是一个字符串,也会扩容,扩容后的StringBuilder中会有很多空闲空间。
2. 大字符串多,小字符串少
优先拼接大字符串。每次扩容长度为(value.length + 1) * 2,扩容以后浪费空间比较少。
但都不是绝对的,视实际业务情况而定。