下文以StringBuffer爲例java
前面咱們用字符串作拼接,比較耗時而且也耗內存(每次都會構造一個新的string對象),而這種拼接操做又是比較常見的,爲了解決這個問題,Java就提供了兩個字符串緩衝區類。StringBuffer和StringBuilder供咱們使用。數組
簡單比較:安全
String 長度大小不可變多線程
StringBuffer 長度可變、線程安全、速度較慢app
StringBuilder 長度可變、線程不安全、速度最快學習
-----------------------------------------------------------------------------------------------------------------優化
解釋:ui
在執行速度方面的比較:StringBuilder > StringBufferthis
StringBuffer與StringBuilder,他們是字符串變量,是可改變的對象,每當咱們用它們對字符串作操做時,其實是在一個對象上操做的,不像String同樣建立一些對象進行操做,因此速度就快了。spa
StringBuilder:線程非安全的
StringBuffer:線程是安全的(synchronized關鍵字進行修飾)
當咱們在字符串緩衝區被多個線程使用時,JVM不能保證StringBuilder的操做是安全的,雖然他的速度最快,可是能夠保證StringBuffer是能夠正確操做的。固然大多數狀況下就是咱們是在單線程下進行的操做,因此大多數狀況下是建議用StringBuilder而不用StringBuffer的,就是速度的緣由。
對於三者使用的總結:
1.若是要操做少許的數據用 = String 2.單線程操做字符串緩衝區 下操做大量數據 = StringBuilder 3.多線程操做字符串緩衝區 下操做大量數據 = StringBuffer
//無參構造方法
StringBuffer()
//指定容量的字符串緩衝區對象
StringBuffer(int size)
//指定字符串內容的字符串緩衝區對象
StringBuffer(String str)
複製代碼
//能夠把任意類型添加到字符串緩衝區裏,而且返回字符串緩衝區自己(this)
public StringBuffer append (String str) //在offset位置把任意類型的數據插入到字符串緩衝區中,而且返回字符串緩衝區自己(this) public StringBuffer insert(int offset,String str) 複製代碼
//刪除指定位置的字符,而且返回自己
public StringBuffer deleteCharAt(int index) //刪除從指定位置開始指定位置結束的內容,而且返回自己 public StringBuffer delete(int start, int end) 複製代碼
//從start到end用str代替
public StringBuffer replace(int start,int end,String str) 複製代碼
//Eg: 好你界世 → 世界你好
public StringBuffer reverse() 複製代碼
//從start位置開始截取,取之後字符串,但不返回自己,原數據不影響
public String substring(int start) //截取start到end之間的字符串 Publci Stirng substring(int start, int end) 複製代碼
String → StringBuffer 是爲了使用後者的功能
StringBuffer → String 可能須要後者的類型
※ String → StringBuffer
String s = 「Hello」
//經過構造方法
StringBuffer a = new StringBuffer(s);
//經過append()方法
StringBuffer a = new StringBuffer();
a.append(s);
複製代碼
※ StringBuffer → String
StringBuffer buffer = new StringBuffer(「java」)
//經過構造方法
String str = new String (buffer);
//經過toString()方法
String str = buffer.toString();
複製代碼
首先java並不支持運算符重載。
(String類中的 「+」「+=」是java中僅有的兩個重載過的運算符)
因此咱們能夠經過「+」符號 將多個字符串進行拼接
將這段代碼利用 javap -c filename 反編譯
咱們能夠看到代碼被編譯器自動優化成使用StringBuilder方式拼接
運行效率獲得了保證
下面一個案例 數組拼接成指定格式的字符串 代碼中使用了循環語句
//在循環中經過String拼接字符串
public class StringBuilderDemo {
public static void main(String[] args) {
String[] arr = {"Hello", "World", "!!!"};
String s1 = arrayToString(arr);
System.out.println(s1);
}
public static String arrayToString(String[] arr) {
String s = "";
s += "[";
for (int x = 0; x < arr.length; x++) {
if (x == arr.length - 1) {
s += arr[x];
} else {
s += arr[x];
s += ", ";
}
}
s += "]";
return s;
}
}
//運行結果
[Hello, World, !!!]
複製代碼
使用String方式進行拼接,咱們反編譯能夠看到,StringBuilder被建立在循環的內部,這意味着每循環一次就會建立一次StringBuilder對象,這但是一個糟糕的事情。
//在循環中使用StringBuilder拼接字符串
public class StringBuilderDemo2 {
public static void main(String[] args) {
String[] arr = {"Hello", "World", "!!!"};
String s1 = arrayToString(arr);
System.out.println(s1);
}
public static String arrayToString(String[] arr) {
StringBuilder s = new StringBuilder();
s.append("[");
for (int x = 0; x < arr.length; x++) {
if (x == arr.length - 1) {
s.append(arr[x]);
} else {
s.append(arr[x]);
s.append(", ");
}
}
s.append("]");
return s.toString();
}
}
//運行結果
[Hello, World, !!!]
複製代碼
使用StringBuilder方式進行拼接,反彙編代碼,能夠看到,不只循環部分的代碼更爲簡潔,並且它只生成了一個StringBuilder對象。顯式的建立StringBuilder對象還容許你預先爲其指定大小。能夠避免屢次從新分配緩衝。
總結:
若是字符串操做比較簡單,就可使用「+」運算符操做,編譯器會爲你合理的構造出最終的字符串結果
若是使用循環語句 最好本身手動建立一個StringBuilder對象,用它來構最終結果
若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^
若是能幫到你的話,那就來關注我吧!(系列文章均會在公衆號第一時間更新)
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤
一個堅持推送原創Java技術的公衆號:理想二旬不止