String 字符串常量;
StringBuffer 字符串變量(線程安全),是一個容器,最終會經過toString方法變成字符串;
StringBuilder 字符串變量(非線程安全)。安全
(1) String在修改時不會改變對象自身
在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,而後將指針指向新的 String 對象,因此常常改變內容的字符串最好不要用 String 。多線程
String str = "abc";//地址str1 str = "def";//地址str2
(2) StringBuffer在修改時會改變對象自身
每次結果都會對 StringBuffer 對象自己進行操做,而不是生成新的對象,再改變對象引用。因此在通常狀況下咱們推薦使用 StringBuffer ,特別是字符串對象常常改變的狀況下。StringBuffer 上的主要操做是 append 和 insert 方法。app
StringBuffer strBuffer = new StringBuffer("abc");//地址strBuffer,值是abc strBuffer.append("def");//地址strBuffer,值是abcdef
public class MyTest { public static void main(String[] args) { String str = "abc"; StringBuffer strBuffer = new StringBuffer(); strBuffer.append("def"); System.out.println(a.getClass() + "@" + str.hashCode()); System.out.println(b.getClass() + "@" + strBuffer.hashCode()); str = "aaa"; strBuffer.append("bbb"); System.out.println(a.getClass() + "@" + str.hashCode()); System.out.println(b.getClass() + "@" + strBuffer.hashCode()); } }
結果:String的地址已改變,對象已經改變爲另外一個;StringBuffer地址不變,仍是一樣的對象。測試
(1)String線程不安全
(2)StringBuffer是線程安全的,可是執行效率稍微慢些。ui
(1)Stringthis
StringBuffer s = null; StringBuffer s = 「abc」;
(2)StringBufferspa
StringBuffer s = null; //結果警告:Null pointer access: The variable result can only be null at this location
StringBuffer s = new StringBuffer();//StringBuffer對象是一個空的對象 StringBuffer s = new StringBuffer(「abc」);//建立帶有內容的StringBuffer對象,對象的內容就是字符串」abc」
StringBuffer和String屬於不一樣的類型,也不能直接進行強制類型轉換
StringBuffer對象和String對象之間的互轉的代碼以下:線程
String s = 「abc」; StringBuffer sb1 = new StringBuffer(「123」); StringBuffer sb2 = new StringBuffer(s); //String轉換爲StringBuffer String s1 = sb1.toString(); //StringBuffer轉換爲String
StringBuffer類中的方法主要偏重於對於字符串的變化,例如追加、插入和刪除等
經常使用方法有:append方法、insert方法、deleteCharAt方法、reverse方法等。設計
(1)若是要操做少許的數據用 String;
(2)(多線程下)常常須要對一個字符串進行修改,例如追加、插入和刪除等操做,使用StringBuffer要更加適合一些。指針
此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用做 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種狀況很廣泛)。
(1) StringBuffer:線程安全的;
(2) StringBuilder:線程非安全的。
因爲String對象不可變,重複新建對象;StringBuffer對象可變。
當咱們在字符串緩衝去被多個線程使用是,JVM不能保證StringBuilder的操做是安全的,雖然他的速度最快,可是能夠保證StringBuffer是能夠正確操做的。固然大多數狀況下就是咱們是在單線程下進行的操做,因此大多數狀況下是建議用StringBuilder而不用StringBuffer的。
如下狀況:String效率是遠要比StringBuffer快的:
String S1 = 「This is only a」 + 「 simple」 + 「 test」; StringBuffer Sb = new StringBuilder(「This is only a」).append(「simple」).append(「 test」);
而如下,String速度是很是慢的:
String S2 = 「This is only a」; String S3 = 「 simple」; String S4 = 「 test」; String S1 = S2 +S3 + S4;
(1)若是要操做少許的數據用 String;
(2)多線程操做字符串緩衝區下操做大量數據 StringBuffer;
(3)單線程操做字符串緩衝區下操做大量數據 StringBuilder。
頂
2
踩