對string類型的分析(堆棧)html
在建立一個值類型的時候,只是在棧中開闢一個空間(所謂的棧是指暫時存放值的地方就像是一個客棧,比較方便人們的進出,因此值類型的效率比引用類型的效率要高),而建立引用類型的時候是在棧中存放一個引用來指向堆中一個值。app
在引用類型當中string類型是比較特殊的,它在有些時候具備值類型的特徵。ui
例:.net
string str1="zhangsan";htm
string str2="zhangsan";對象
str1="lisi";blog
Console.WriteLine(str2);內存
Console.WriteLine(str1);字符串
Console.Read();get
在這種難過狀況下輸出的str2的值是"zhangsan",而str1的值是"lisi";
詳解:
在建立str1的時候在棧中開闢了一個引用,並將值"zhangsan"存放到堆中,這個引用指向了堆中的那個值("zhangsan")。
當str2="zhangsan"時,中間發生什麼了呢?
在例子中str1="zhangsan",這時在內存中就將「zhangsan」存下來,若是再建立字符串對象,其值也等於「zhangsan」,str2="zhangsan",則並不是再從新分配內存空間,而是將以前保存的「zhangsan」的地址賦給str2的引用。而當str1="lisi"其值發生改變時,這時檢查內存,發現不存在此字符串,則從新分配內存空間,存儲「lisi」,並將其地址賦給str1,而str2依然指向「zhangsan」的地址。
注:
string最爲顯著的一個特色就是它具備恆定不變性:咱們一旦建立了一個string,在managed heap 上爲他分配了一塊連續的內存空間,咱們將不能以任何方式對這個string進行修改使之變長、變短、改變格式。全部對這個string進行各項操做(好比調用ToUpper得到大寫格式的string)而返回的string,實際上另外一個從新建立的string,其自己並不會產生任何變化。
string 對象稱爲不可變的(只讀),由於一旦建立了該對象,就不能修改該對象的值。有的時候看來彷佛修改了,實際是string通過了特殊處理,每次改變值時都會創建一個新的string對象,變量會指向這個新的對象,而原來的仍是指向原來的對象,因此不會改變。這也是string效率低下的緣由。
引用:http://blog.csdn.net/z3h0a5n8g8x9i9a2o3/article/details/8264792
------------------------------------------------------------------------------
String+=和StringBuilder.append以及StringBuffer.append的比較
引用:http://alqm1314-126-com.iteye.com/blog/1932879
-------------------------------------------------
引用:http://http://www.cnblogs.com/ITtangtang/p/3976820.html
---------------------------------------------------
String a="a"+"b"+"c"在內存中建立幾個對象?
https://www.zhihu.com/question/38733755/answer/119407476
----------------------------------------------