C# string、stringBuffer和stringBuilder

香草萌萌茶發表於2020-11-12

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。

相關文章