asp教程.net c# string 與 stringbuffer
關鍵點
1). 簡單的認為 .append() 效率好於 "+" 是錯誤的!
2). 不要使用 new 建立 string
3). 注意 .intern() 的使用
4). 在編譯期能夠確定字串值的情況下,使用"+"效率最高
5). 避免使用 "+=" 來構造字串
6). 在聲明stringbuffer對象的時候,指定合適的capacity,不要使用預設值
首先我們必須清楚的一點是string類是final類型的,因此你不可以繼承這個類、不能修改這個類。我們使用string的時候非常簡單,通常都是string s = "hello",但是java api中同時提供了一個建構函式為string(string s),因此你也可以這樣使用string s = new string("hello"),對於後面這樣初始化一個string的方式是不推薦的,因為new操作符意味著將會在heap上產生一個新的對象,如果這樣的操作發生在一個迴圈中,那麼代價是慘重的。比如
for(int i = 0;i<1000;i++)
{
string s = new string("hello");
}
這將會建立1000個string類型的對象,由於string類是final的,因此這樣的操作事實上是每次都產生了一個新的string對象的。如果你使用string s = "hello";那麼就可以實現複用了,為什麼可以複用呢,下面會有解釋:
string s = "hello";
jvm先根據內容"hello"尋找對象,如果沒有找到,則在heap上建立新對象,並將其賦予s1,否則使用已經存在的對象
string s = new string("hello");
jvm直接在heap上建立新的對象,所以在heap中會出現內容相同,地址不同的string對象
stringbuffer是產生一塊記憶體空間,進行相干的增刪改操作都在這塊可擴充的記憶體上來操作,所以它對記憶體空間的消耗是有最佳化的,特別是在迴圈中
效率:string 與 stringbuffer
情景1:
(1) string result = "hello" + " world";
(2) stringbuffer result = new string().append("hello").append(" world");
(1) 的效率好於 (2),不要奇怪,這是因為jvm會做如下處理
編譯前 string result = "hello" + " world";
編譯後 string result = "hello world";