1. 程式人生 > >String、StringBuffer與StringBuilder區別

String、StringBuffer與StringBuilder區別

(1)區別

  • String內容不可變,StringBuffer和StringBuilder內容可變;
  • StringBuilder非執行緒安全(單執行緒使用),String與StringBuffer執行緒安全(多執行緒使用);
  • 如果程式不是多執行緒的,那麼使用StringBuilder效率高於StringBuffer。

  (2) String的兩個最重要的特點

  • String是值不可變的常量,是執行緒安全的(can be shared)。
  • String類使用了final修飾符,String類是不可繼承的。

(3)StringBuffer字串變數(執行緒安全)是一個容器,最終會通過toString方法變成字串;

(4)StringBuilder 字串變數(非執行緒安全)。

String與StringBuffer區別

1) String在修改時不會改變物件自身 

 在每次對 String 型別進行改變的時候其實都等同於生成了一個新的 String 物件,然後將指標指向新的 String 物件,所以經常改變內容的字串最好不要用 String 。

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

(2) StringBuffer在修改時會改變物件自身 
  每次結果都會對 StringBuffer 物件本身進行操作,而不是生成新的物件,再改變物件引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字串物件經常改變的情況下。StringBuffer 上的主要操作是 append 和 insert 方法。

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

初始化區別


(1)String

StringBuffer s = null;   
StringBuffer s = “abc”;   
  • 1
  • 2

(2)StringBuffer

StringBuffer s = null; //結果警告:Null pointer access: The variable result can only be null at this location
  • 1
StringBuffer s = new
StringBuffer();//StringBuffer物件是一個空的物件 StringBuffer s = new StringBuffer(“abc”);//建立帶有內容的StringBuffer物件,物件的內容就是字串”abc”
  • 1
  • 2

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

StringBuffer相對String偏重

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

總結


(1)如果要操作少量的資料用 String; 

(2)(多執行緒下)經常需要對一個字串進行修改,例如追加、插入和刪除等操作,使用StringBuffer要更加適合一些。

StringBuffer與StringBuilder區別

1 StringBuilder是可變的物件,是5.0新增的

此類提供一個與StringBuffer相容的 API,但不保證同步。該類被設計用作StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。

2 執行緒安全性

(1) StringBuffer:執行緒安全的; 

(2) StringBuilder:執行緒非安全的。

String,StringBuffer與StringBuilder速度區別

1.在大部分情況下,StringBuffer > String

 由於String物件不可變,重複新建物件;StringBuffer物件可變。

2 StringBuilder > StringBuffer

當我們在字串緩衝區被多個執行緒使用時,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單執行緒下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的。

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
  • 3
//String速度是非常慢的:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
  • 1
  • 2
  • 3
  • 4
  • 5

總結

(1)如果要操作少量的資料用 String; 

(2)多執行緒操作字串緩衝區下操作大量資料 StringBuffer; 

(3)單執行緒操作字串緩衝區下操作大量資料 StringBuilder。