2012年3月13日 星期二

[Java] String兩三事

String是個非常常用的一個class
不過有些細節今天上課才知道0.0

String物件在被建立之後就是不可變的
重新assign值給他其實就是砍掉重練
append字串這個動作亦同
基本上就是會先產生一個StringBuffer來進行append再轉回String

因為這個緣故,當在一個迴圈中連續的append字串的話
直接使用最直覺的"str1 += str2;" 就會造成很嚴重的系統負擔
因為每一次動作都要先新建立一個StringBuffer然後收回
剛剛實測了一下執行時間大概差到了100倍

所以比較好的寫法應該是要先建立一個StringBuffer
進行完多次append後再將其存回String

另外有關substring的實作
再進行這個動作後,這個新的字串並沒有複製出來
而是指向原本String的位置

這種設計的立意應該是為了節省資源使用
不過在某些狀況反而會造成更大的系統負擔
像是要連續多次從不同的大字串中提取小字串
在這個狀況下,因為有被指向,所以大字串的記憶體空間不回被釋放
可能就會造成記憶體不足

要解決這種狀況就是要記得new出一個新的字串
String smallStr = new String(largeStr.substring(2, 5));


良葛格這篇其實就很清楚了@@
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/ImmutableString.htm