String 對象是不可改變的。每次使用 System.String 類中的方法之一時,都要在內存中創建一個新的字符串對象,這就需要為該新對象分配新的空間。
例如: string a="a";a+="b";,每次在后面追加都會重新申請一個能放字符串的內存空間;
string Interning(字符串駐留)指的是通過維護一張表來存放字符串。CLR內部維護了一個哈希表(Hash Table)來管理其創建的大部分string對象,其中key為string本身,而value為分配給對應string的內存地址。
public static string Intern(string str);
public static string IsInterned(string str);
兩者的處理機制都是在哈希表中查找是否存在str參數字符串,如果找到就返回已存在的string對象的引用,沒有找到,Intern方法將該str字符串添加到哈希表,並返回引用;而IsInterned方法則不會向哈希表中添加字符串,而是返回null;
StringBuilder 對象是動態對象,允許擴充它所封裝的字符串中字符的數量,但是您可以為它可容納的最大字符數指定一個值,當修改 StringBuilder 時,在達到容量之前,它不會為其自己重新分配空間。當達到容量時,將自動分配新的空間且容量翻倍。可以使用重載的構造函數之一來指定 StringBuilder 類的容量。
例如: StringBuilder sb = new StringBuilder(); sb.Append("a")他不會頻繁申請內存空間,他會自動向后擴展。
兩者的區別:
1. string 對象時恆定不變的,stringBuider對象表示的字符串是可變的。stringBuilder是.net提供的動態創建string的高效方式,以克服string對象恆定性帶來的性能影響。
2. 對於簡單的字符串連接操作,在性能上stringBuilder並不一定總是優於string。因為stringBuider對象創建代價較大,在字符串目標連接較少的情況下,過度濫用stringBuilder會導致性能的浪費,只有大量的或者無法預知次數的字符串操作,才考慮stringBuilder來實現。事實上,一般連接次數設置100次以內,根本看不出兩者的性能差別。
3. 當修改字符串信息時,此時不許創建對象,可以使用stringBuilder對象。