
1. String、StringBuffer、StringBuilder
原文出自《編寫高質量代碼:改善 Java 程序的 151 個建議》web
CharSequence 接口有三個實現類與字符串有關:String、StringBuffer、StringBuilder,雖然它們都與字符串有關,可是其處理機制是不一樣的。數組
String 類是不可改變的量,也就是建立後就不能再修改了,好比建立了一個「abc」這樣的字符串對象,那麼它在內存中永遠都會是「abc」這樣具備固定表面值的一個對象,不能被修改,即便想經過 String 提供的方法來嘗試修改,也是要麼建立一個新的字符串對象,要麼返回本身,好比:安全
String str = "abc";
String str1 = str.substring(1);
StringBuffer 是一個可變字符序列,它與 String 同樣,在內存中保存的都是一個有序的字符序列(char 類型的數組),不一樣點是 StringBuffer 對象的值是可改變的,例如:微信
StringBuffer sb = new StringBuffer("a");
sb.append("b");
從上面的代碼能夠看出 sb 的值在改變,初始化的時候是「a」,通過 append 方法後,其值變成了「ab」。可能有讀者會問了,這與 String 類經過「+」鏈接有什麼區別?例如:多線程
String s = "a";
s = s + "b";
有區別,字符串變量 s 初始化時是「a」對象的引用,通過加號計算後,s 變量就修改成了「ab」的引用,可是初始化的「a」對象仍是沒有改變,只是變量 s 指向了新的引用地址。再看看 StringBuffer 的對象,它的引用地址雖不變,但值在改變。app
StringBuilder 與 StringBuffer 基本相同,都是可變字符序列,不一樣點是:StringBuffer 是線程安全的,StringBuilder 是線程不安全的,翻翻二者的源代碼,就會發如今 StringBuffer 的方法前都有 synchronized 關鍵字,這也是 StringBuffer 在性能上遠低於 StringBuilder 的緣由。編輯器
在性能方面,因爲 String 類的操做都是產生新的 String 對象,而 StringBuilder 和 StringBuffer 只是一個字符數組的再擴容而已,因此 String 類的操做要遠慢於 StringBuffer 和 StringBuilder。post
弄清楚了三者的原理,咱們就能夠在不一樣的場景下使用不一樣的字符序列了:性能
(1)使用 String 類的場景ui
在字符串不常常變化的場景中能夠使用 String 類,例如常量的聲明、少許的變量運算等。
(2)使用 StringBuffer 類的場景
在頻繁進行字符串的運算(如拼接、替換、刪除等),而且運行在多線程的環境中,則能夠考慮使用 StringBuffer,例如 XML 解析、HTTP 參數解析和封裝等。
(3)使用 StringBuilder 類的場景
在頻繁進行字符串的運算(如拼接、替換、刪除等),而且運行在單線程的環境中,則能夠考慮使用 StringBuilder,如 SQL 語句的拼裝、JSON 封裝等。
2 String,StringBuffer, StringBuilder 的區別是什麼
原文地址:https://juejin.im/post/5a5d5c66f265da3e261bf46c
做者:wangchun_166
一、String 是字符串常量,而 StringBuffer 和 StringBuilder 是字符串變量。由 String 建立的字符內容是不可改變的,而由 StringBuffer 和 StringBuidler 建立的字符內容是能夠改變的。
二、StringBuffer 是線程安全的,而 StringBuilder 是非線程安全的。StringBuilder 是從 JDK 5 開始,爲 StringBuffer 類補充的一個單線程的等價類。咱們在使用時應優先考慮使用 StringBuilder,由於它支持 StringBuffer 的全部操做,可是由於它不執行同步,不會有線程安全帶來額外的系統消耗,因此速度更快。


- END -

本文分享自微信公衆號 - 駭客與畫家(hacker-and-painter)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。