对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
----------------------------------------------