String, StringBuffer,StringBuilder轉回帖

1 概述

String 字符串常量; 
StringBuffer 字符串變量(線程安全),是一個容器,最終會經過toString方法變成字符串; 
StringBuilder 字符串變量(非線程安全)。安全

2 String與StringBuffer區別

2.1 在修改時對象自身是否可變(主要區別)

(1) String在修改時不會改變對象自身 
在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,而後將指針指向新的 String 對象,因此常常改變內容的字符串最好不要用 String 。多線程

String str = "abc";//地址str1
str = "def";//地址str2
  • 1
  • 2
  • 1
  • 2

(2) StringBuffer在修改時會改變對象自身 
每次結果都會對 StringBuffer 對象自己進行操做,而不是生成新的對象,再改變對象引用。因此在通常狀況下咱們推薦使用 StringBuffer ,特別是字符串對象常常改變的狀況下。StringBuffer 上的主要操做是 append 和 insert 方法。app

StringBuffer strBuffer = new StringBuffer("abc");//地址strBuffer,值是abc
strBuffer.append("def");//地址strBuffer,值是abcdef
  • 1
  • 2
  • 1
  • 2

2.2 是否可變測試

2.2.1 測試代碼

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());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.2.2 結果

這裏寫圖片描述

結果:String的地址已改變,對象已經改變爲另外一個;StringBuffer地址不變,仍是一樣的對象。測試

2.3 線程是否安全

(1)String線程不安全 
(2)StringBuffer是線程安全的,可是執行效率稍微慢些。ui

2.4 初始化區別

(1)Stringthis

StringBuffer s = null;   
StringBuffer s = 「abc」;
  • 1
  • 2
  • 1
  • 2

(2)StringBufferspa

StringBuffer s = null; //結果警告:Null pointer access: The variable result can only be null at this location
  • 1
  • 1
StringBuffer s = new StringBuffer();//StringBuffer對象是一個空的對象

StringBuffer s = new StringBuffer(「abc」);//建立帶有內容的StringBuffer對象,對象的內容就是字符串」abc」
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

2.5 StringBuffer對象和String對象之間的互轉

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
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

2.6 StringBuffer相對String偏重

StringBuffer類中的方法主要偏重於對於字符串的變化,例如追加、插入和刪除等 
經常使用方法有:append方法、insert方法、deleteCharAt方法、reverse方法等。設計

2.7 總結

(1)若是要操做少許的數據用 String; 
(2)(多線程下)常常須要對一個字符串進行修改,例如追加、插入和刪除等操做,使用StringBuffer要更加適合一些。指針

3 StringBuffer與StringBuilder區別

3.1 StringBuilder是可變的對象,是5.0新增的

此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用做 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種狀況很廣泛)。

3.2 線程安全性

(1) StringBuffer:線程安全的; 
(2) StringBuilder:線程非安全的。

4 String,StringBuffer與StringBuilder速度區別

4.1 在大部分狀況下,StringBuffer > String

因爲String對象不可變,重複新建對象;StringBuffer對象可變。

4.2 StringBuilder > StringBuffer

當咱們在字符串緩衝去被多個線程使用是,JVM不能保證StringBuilder的操做是安全的,雖然他的速度最快,可是能夠保證StringBuffer是能夠正確操做的。固然大多數狀況下就是咱們是在單線程下進行的操做,因此大多數狀況下是建議用StringBuilder而不用StringBuffer的。

4.3 特殊狀況, String > StringBuffer

如下狀況:String效率是遠要比StringBuffer快的:

String S1 = 「This is only a」 + 「 simple」 + 「 test」;
StringBuffer Sb = new StringBuilder(「This is only a」).append(「simple」).append(「 test」);
  • 1
  • 2
  • 1
  • 2

而如下,String速度是很是慢的:

String S2 = 「This is only a」;
String S3 = 「 simple」;
String S4 = 「 test」;
String S1 = S2 +S3 + S4;
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

5 總結

(1)若是要操做少許的數據用 String; 
(2)多線程操做字符串緩衝區下操做大量數據 StringBuffer; 
(3)單線程操做字符串緩衝區下操做大量數據 StringBuilder。

2

相關文章
相關標籤/搜索