String,StringBuilder,StringBuffer的區別?
阿新 • • 發佈:2018-11-19
1.執行速度,在這方面執行速度快慢為:StringBuilder >StringBuffer >String
String 最慢的原因:
String 為字串常量,而StringBuilder 和 StringBuffer 均為字串變數,即 String 物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的。
2.執行緒安全
線上程安全上,StringBuilder 是執行緒不安全的,而 StringBuilder 是執行緒安全的 (StringBuffer 中很多方法可以帶有synchronized 關鍵字)
3.總結一下
String:適用於少量的字串操作的情況;
StringBuilder:適用於單執行緒下載字元緩衝區進行大量操作的情況;
StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況;
結合 jdk 的原始碼檢視
參考程式碼: StringBuTest
// String,StringBuilder,StringBuffer簡單使用測試 public class StringBuTest { public static void main(String[] args) { String s1 = "233"; s1 = s1 + "wwww"; System.out.println(s1); StringBuilder sbd = new StringBuilder(); sbd.append("StringBuilder").append("12").append("34").append("56"); System.out.println("StringBuilder:" + sbd.toString()); StringBuffer sbf = new StringBuffer(); sbf.append("stringbuffer").append("12").append("34").append("56"); System.out.println("StringBuffer:" + sbf.toString()); StringBuilder sb = new StringBuilder("1111199999"); StringBuffer sbffer = new StringBuffer("1111199999"); // 下面是驗證執行緒安全的測試 // 迴圈建立多個執行緒,測試StringBuilder // for (int i = 0; i < 100; i++) { // new Thread(new MyThread(sb)).start(); // } // 迴圈建立多個執行緒,測試StringBuffer for (int i = 0; i < 100; i++) { new Thread(new MyThreadSbf(sbffer)).start(); } } private static class MyThread implements Runnable { // 定義成員屬性 private StringBuilder sb; // 建構函式,引數初始化 private MyThread(StringBuilder sb) { this.sb = sb; } public void run() { // 迴圈可以增加出現執行緒不安全的情況 for (int i = 0; i < 100; i++) { sb.reverse(); } // 輸出sb字串(預設呼叫了toString()) System.out.println(sb); } } private static class MyThreadSbf implements Runnable { // 定義成員屬性 private StringBuffer sb; // 建構函式,引數初始化 private MyThreadSbf(StringBuffer sb) { this.sb = sb; } public void run() { // 迴圈可以增加出現執行緒不安全的情況發生 for (int i = 0; i < 100; i++) { sb.reverse(); } // 輸出sb字串(預設呼叫了toString()) System.out.println(sb); } } }