new StringBuilder() VS new StringBuilder(arg)

StringBuilder,非線程安全的,避免作爲類變量存儲信息。


//1.
StringBuilder sb_1=new StringBuilder(); //內部的字符數組長度默認爲16
sb_1.append("0123456789"); //此時內部的字符數組的長度仍然是16 , 未利用空間爲6
sb_1.append("abcdef");//此時內部的字符數組的長度仍然是16, 未利用空間爲0
sb_1.append("N");//此時內部的字符數組的長度是34,34=(16+1)*2 , 未利用空間爲17
sb_1.append("0123456789abcdefN1");//此時內部的字符數組的長度是70,70=(34+1)*2,未利用空間爲35

//2.
StringBuilder sb_2=new StringBuilder("0123456789");//內部的字符數組長度=構造器內參數.length()+16,這裏爲26, 未利用空間爲16
sb_2.append("abcdef"); //此時內部的字符數組長度未變,爲26, 未利用空間爲10
sb_2.append("N");//此時內部的字符數組長度仍然是26, 未利用空間爲9
sb_2.append("0123456789abcdefN1");//此時內部的字符數組的長度是54,54=(26+1)*2,未利用空間爲19

/**
* 第一種方式,再追加長度爲35的字符串時,內部的字符數組長度不變,仍爲70,未利用空間爲0.
* 第二種方式,再追加長度爲35的字符串時,內部的字符數組長度變爲110,未利用空間爲40.
*
* 第一種方式,繼續追加長度爲1的字符串時,內部的字符數組長度變爲142,未利用空間爲71.
* 第二種方式,繼續追加長度爲1的字符串時,內部的字符數組長度變爲110,未利用空間爲39.
*
* 未利用空間對比如下:
* 6<-->16, 0<-->10, 17<-->9, 35<-->19, 0<-->40, 19<-->39
* 前者比上後者,小於0.5的可能性較大,大於2的可能性較小。
* 沒有采用多次隨機的方式演練,但是:
* 在拼接更長的字符串時,且目標字符串長度未知的情況下,
* 若採用第二種方式,內部的字符數組長度的遞增速度更快. 可能會浪費更多的空間.
* 所以建議使用new StringBuilder();
* (win32, jdk5)
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章