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。