從JAVA誕生那天起,稍微“有些水平”的程式員都被告知,如果有大量的字串連結,請不要使用字串相加,而應該使用
StringBuffer的append操作然後toString().
到了JAVA5,我們又被告訴知,StringBuilder是StringBuffer的非同步版,所以絕對大多數時候我們“更”可以用StringBuilder
來代替加操作。因為一個可能被多線程訪問的執行個體欄位的StringBuffer操作的情況很少,和在方法中調用字串連結相比1%都不到。
但是到了JAVA6,因為編譯器“始終”把字串的+連結編譯成StringBuilder,所以在99%的情況,我們應該使用加操作。
理由是:
1.用加操作比其它操作看起來直觀,寫起來省事,JAVA6之前,即使明知道有效能問題我們還會在一些時候全使用+連結,根本原因當然是
這種寫法直觀,簡單。
String str = "Axman" + " is " + "a great lion.";
//請注意,這裡的例子只是為了說明"+"寫法直觀,並不是說只有常量字串相加(常量字串其實直接編譯成一個字串而不是
//append了)JAVA6才最佳化,那是之前的事,對於JAVA6,只要有是字串操作的的+連結(第一個變數或常量是字串),後面不管是常量還是變數,都會進行編譯最佳化
StringBuilder sb = new StringBuilder();
sb.append("Axman")
.append(" is ")
.append(" a great lion.");
String str = sb.toString();
誰要說第二種試方式美觀寫起來爽我一定當面抽他。打到他腦子正常為止。
2.我們有時還自覺不自覺地使用StringBuffer,而JAVA6總是把第一種形式最佳化為StringBuilder,在99%的情況下效能更好,除非你需要一個被多線程訪問的執行個體欄位操作。
3.特別是,有時我們自己寫StringBuilder時,sb.append(line);後來想在前後加一個"<",">",於是很懶地寫成
sb.append("<"+line+">");這種情況非常多,但這樣情況是先產生一個StringBuilder計算"<"+line+">",然後toString()
StringBuilder所append,還不如全部加操作讓編譯器用一個StringBuilder來append.
當然,迴圈中加操作千萬不要這麼做(這種需求除了測試,實際應用可能是萬分之一的機會吧?),編譯器雖然會最佳化編譯,但它是在迴圈內部產生StringBuilder而不是在外部。這種情況一定要自己在外部手工定義StringBuilder而不能依賴編譯器了。但絕對多數情況,也就是99%的情況我們是 str = "axman" + new Object() +1 + "good" +.......這種方式,完全可以信任編譯器來最佳化。
另外只有兩個字串連結時請使用concat.
實在忍無可忍,對於一些偽技術人員,如果你覺得你需要反駁我的觀點,請你貼上你的源碼和編譯後的效果來反駁,不要無恥地說兩句放屁的話。