StringBuffer 和 StringBuilder
1 相同點(diǎn):
(1) StringBuffer 和 StringBuilder 都繼承了AbstractStringBuilder
(2) StringBuffer和StringBuilder底層初始化容量都是16
(3) StringBuffer和StringBuilder都只是生成一個(gè)String對象
2 不同點(diǎn):
(1) StringBuffer 是線程安全,StringBuilder是線程不安全的,(因?yàn)镾tringBuffer中的方法都是由synchronized關(guān)鍵字修飾的)
(2) StringBuffer中使用的是 一個(gè)char[] 數(shù)組作為緩沖區(qū),StringBuilder中根據(jù)傳值,通過值的length+初始化容量變?yōu)榇藭r(shí)的容量大小
StringBuffer 擴(kuò)容源碼如下(實(shí)際是 AbstractStringBuilder擴(kuò)容方法)
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
PS: 從上所看(<p>value.length * 2 + 2;</p>
緩沖區(qū)長度*2+2 >傳進(jìn)來的容量大小,那么就將傳進(jìn)來的容量大小作為該StringBuffer的容量)