string使用的陷阱
string一經初始化後,就不會再改變其內容了。對string字串的操作實際上是對其副本(原始拷貝)的操作,原來的字串一點都沒有改變。比如:
string s ="a"; 建立了乙個字串
s = s+"b"; 實際上原來的"a"字串物件已經丟棄了,現在又產生了另乙個字串s+"b"(也就是"ab")。 如果多次執行這些改變串內容的操作,會導致大量副本字串物件存留在記憶體中,降低效率。如果這樣的操作放到迴圈中,會極大影響程式的時間和空間效能,甚至會造成伺服器的崩潰。
相反,stringbuilder和stringbuffer類是對原字串本身操作的,可以對字串進行修改而不產生副本拷貝或者產生少量的副本。因此可以在迴圈中使用。
【示例8-13】string和stringbuilder在頻繁字串修改時效率測試
public
class
test
long
num2 = runtime.getruntime().freememory();
long
time2 = system.currenttimemillis();
system.out.println(
"string占用記憶體 : "
+ (num1 - num2));
system.out.println(
"string占用時間 : "
+ (time2 - time1));
/**使用stringbuilder進行字串的拼接*/
stringbuilder sb1 =
new
stringbuilder(
""
);
long
num3 = runtime.getruntime().freememory();
long
time3 = system.currenttimemillis();
for
(
int
i =
0
; i <
5000
; i++)
long
num4 = runtime.getruntime().freememory();
long
time4 = system.currenttimemillis();
system.out.println(
"stringbuilder占用記憶體 : "
+ (num3 - num4));
system.out.println(
"stringbuilder占用時間 : "
+ (time4 - time3));
}
}
執行結果如圖8-12所示:
圖8-12 示例8-13執行效果圖
要點:
1. string:不可變字串行。
2. stringbuffer:可變字串行,並且執行緒安全,但是效率低。
3. stringbuilder:可變字串行,執行緒不安全,但是效率高(一般用它)。
測試可變字串行和不可變字串行使用的陷阱 s
一.使用string進行字串拼接 string str1 long num1 runtime.getruntime freememory 獲取系統剩餘記憶體空間 long num2 system.currenttimemillis 獲取系統當前時間 for int i 0 i 5000 i long...
Java陣列 可變字串行
stringbulider 常用 與stringbuffer 可變字串行 stringbuilder 執行緒不安全,效率高,一般用這個 stringbuffer 執行緒安全 author administrator public class teststringbuilder stringbuild...
可變和不可變
可變和不可變 不可變 物件所指向的記憶體中的值是不可以改變 不可變型別 int ser float 元組tuple num 10s1 abc print id s1 s1 abcd print id s1 t1 2 5,6 print id t1 t1 2 5 print id t1 可變的 物件所...