爲何String和StringBuilder相比,String這麼慢?

存儲的時的區別.

先來看看各自都是如何存儲的數組

String


StringBuilder


StringBuffer繼承自AbstractStringBuilder,自身沒有定義存儲的容器,而是繼承了其父類的容器bash

這個就是StringBuilder存儲字符的地方ui

從上面看出,String的字符是存儲在一個被final修飾的char數組(相似於c中的指針常量)中的,而StringBuilder的字符是存儲在一個普通的char數組中的spa

<hr>指針

運算時的區別

String的運算


這兩個相加的操做能夠看做這樣code

final char c1[] = {'第','一','個','字','符','串'};
​final char c2[] = {'第','二','個','字','符','串'};
​final char c3[] = new char[12];
c3[] =  {'第','一','個','字','符','串','第','二','個','字','符','串'};
​c1 = c3;​
//這段只作理解複製代碼

String在運算的時候都會建立一個大小合適的char數組[],因此當下次再拼接的時候都要進行從新分配.cdn

StringBuilder的運算



StringBuilder特徵blog

  • StringBuilder初始化容量是16(無參構造)繼承

  • 追加以前會計算一次容量,大於所需容量則會從新建立一個char[]數組,計算規則是 newCapacity = (value.length << 1) + 2; 也就是 原來長度*2+2內存

  • StringBuilder在運算的時候每次會計算容量是否足夠,若是所需容量不小於自身容量,那麼就會從新分配一個自身容量兩倍+2的char[].因此省去了不少建立char[]的次數.​

大白話結論

  • String之因此慢是由於,大部分cpu資源都被浪費在分配資源,拷貝資源的部分了,相比StringBuilder有更多的內存消耗.

  • StringBuilder快就快在,相比String,他在運算的時候分配內存次數小,因此拷貝次數和內存佔用也隨之減小.

  • 因爲GC的機制,即使原來的char[]沒有引用了,那麼也得等到GC觸發的時候才能回收,String運算過多的時候就會產生大量垃圾,消耗內存.

建議

  • 若是目標字符串須要大量拼接的操做,那麼這個時候應當使用StringBuilder.

  • 反之,若是目標字符串操做次數極少,或者是常量,那麼就直接使用String.

相關文章
相關標籤/搜索