C# string、stringBuffer和stringBuilder
String、StringBuffer與StringBuilder之間區別
String字串常量
String 型別和 StringBuffer 型別的主要效能區別其實在於String 是不可變的物件。
因此在每次對 String 型別進行改變的時候其實都等同於生成了一個新的 String 物件,然後將指標指向新的 String 物件,這樣不僅效率低下,而且大量浪費有限的記憶體空間,所以經常改變內容的字串最好不要用 String 。因為每次生成物件都會對系統效能產生影響,特別當記憶體中無引用物件多了以後, GC 就會開始工作,那速度是一定會相當慢的。
對String操作時記憶體變化的圖:
可以看到,初始String值為“hello”,然後在這個字串後面加上新的字串“world”,這個過程是需要重新在棧堆記憶體中開闢記憶體空間的,最終得到了“hello world”字串也相應的需要開闢記憶體空間,這樣短短的兩個字串,卻需要開闢三次記憶體空間,不得不說這是對記憶體空間的極大浪費。
為了應對經常性的字串相關的操作,就需要使用其他兩個操作字串的類
——StringBuffer類和StringBuild類來對此種變化字串進行處理。
StringBuffer、StringBuilder字串變數
StringBuffer 字串變數(執行緒安全)
StringBuilder 字串變數(非執行緒安)
當對字串進行修改的時候,特別是字串物件經常改變的情況下,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。
StringBuilder 和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是執行緒安全的(不能同步訪問)。
由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程式要求執行緒安全的情況下,則必須使用 StringBuffer 類。
當我們在字串緩衝去被多個執行緒使用是,JVM不能保證StringBuilder的操作是安全的,
雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。
當然大多數情況下就是我們是在單執行緒下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因
如果要操作少量的資料用 = String
2.單執行緒操作字串緩衝區 下操作大量資料 = StringBuilder
3.多執行緒操作字串緩衝區 下操作大量資料 = StringBuffer
三者在執行速度方面的比
StringBuilder>StringBuffer> String
String<( StringBuilder,StringBuffer)的原因
從上面的名字可以看到,String是“字串常量”,也就是不可改變的物件。對於這句話的理解你可能會產生這樣一個疑問 ,比如:
我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢?
其實這是一種欺騙,JVM是這樣解析這段程式碼的:首先建立物件s,賦予一個abcd,然後再建立一個新的物件s用來
執行第二行程式碼,也就是說我們之前物件s並沒有變化,所以我們說String型別是不可改變的物件了,
由於這種機制,每當用String操作字串時,實際上是在不斷的建立新的物件,而原來的物件就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底
三者的繼承結構
三者的區別:
(1)字元修改上的區別(主要,見上面分析)
(2)初始化上的區別,String可以空賦值,後者不行,報錯
①String
String s = null;
String s = “abc”;
②StringBuffer
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物件,物件的內容就是字串”
小結:(1)如果要操作少量的資料用 String;
(2)多執行緒操作字串緩衝區下操作大量資料 StringBuffer;
(3)單執行緒操作字串緩衝區下操作大量資料 StringBuilder。
相關文章
- String、StringBuilder和StringBufferUI
- 【Java】String、StringBuilder和StringBufferJavaUI
- java String,StringBuilder和StringBufferJavaUI
- [Java]String、StringBuilder和StringBufferJavaUI
- String和StringBuilder和StringBuffer三兄弟UI
- String、StringBuffer和StringBuilder類的UI
- String、StringBuffer、StringBuilder剖析UI
- Java String StringBuilder 和 StringBuffer 用法詳解JavaUI
- String、StringBuffer、StringBuilder區別?UI
- String、StringBuffer、StringBuilder的理解UI
- String,StringBuffer,StringBuilder區別UI
- 從為什麼String=String談到StringBuilder和StringBufferUI
- 老生常談 String、StringBuilder、StringBufferUI
- String,StringBuilder,StringBuffer的區別UI
- String、StringBuilder、StringBuffer的區別UI
- Java字串(String_StringBuilder_StringBuffer)Java字串UI
- 正確使用String,StringBuffer,StringBuilderUI
- String、StringBuffer、StringBuilder的區別UI
- StringBuffer和StringBuilderUI
- String,StringBuffer與StringBuilder的區別UI
- java複習之 String,StringBuffer,StringBuilderJavaUI
- String、StringBuffer、與StringBuilder的區別UI
- String,StringBuffer與StringBuilder的區別??UI
- [C#] string 和 StringBuilder 的比較C#UI
- Java中String,StringBuffer和StringBuilder的區別(轉載)JavaUI
- Android- String、StringBuffer、StringBuilder區別AndroidUI
- Java中String/StringBuffer/StringBuilder區別(轉)JavaUI
- String、StringBuffer與StringBuilder之間區別UI
- StringBuffer 和 StringBuilder 類UI
- StringBuilder、StringBuffer和String三者的聯絡和區別(轉)UI
- Java中String,StringBuffer,StringBuilder基礎知識JavaUI
- 認識Java中String與StringBuffer以及StringBuilderJavaUI
- 面試必知:String、StringBuilder、StringBuffer的區別面試UI
- Java容器深入淺出之String、StringBuffer、StringBuilderJavaUI
- String, StringBuilder, StringBuffer 之間的區別 - JavaUIJava
- String StringBuffer StringBuilder 三者的區別UI
- Java 之String、StringBuffer 和 StringBuilder 三者區別介紹JavaUI
- Java StringBuffer 和 StringBuilder 類JavaUI