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,擴容以后浪費空間比較少。
但都不是絕對的,視實際業務情況而定。