java String 性能

 對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

 

-------------------------------------------------

深刻理解Java:String


引用:http://http://www.cnblogs.com/ITtangtang/p/3976820.html

 

---------------------------------------------------

String a="a"+"b"+"c"在內存中建立幾個對象?

https://www.zhihu.com/question/38733755/answer/119407476

 

----------------------------------------------

【經典】用棧和堆來理解 String。好文章:String 必需要理解!!!

http://blog.csdn.net/itm_hadf/article/details/7398529

相關文章
相關標籤/搜索