2013年9月25日 星期三

Java 6 和 Java 7 的 substring() 的差別

其實這應該算是 BUG 修正吧~
在 Java 6 時,稍微有注意效率的人可能會知道
因為 Java 的字串是不可變動的,因此呼叫 substring() 時,它做的是把指標指向原字串的其中一小段
因此假設原字串有 1000 個字元,而 substring() 後只需要 3 個字元
實際上在使用這 3 個字元時,還是隨時把那 1000 個字元帶著跑,即使裡面有 997 個字元是不需要的。

Java 6 的 substring() 的概念如下圖所示:

(圖片節錄自 [1])

根據 [1] 的描述,這個問題在 Java 7 已經獲得解決,Java 7 的 substring() 會真的建立一個比較小的字串,如圖所示。

(圖片節錄自 [1])

這點我覺得算是有好有壞吧!
在 Java 6 的方法,如果原字串跟眾多的子字串全都有保留的必要,那麼透過 substring() 產生各種子字串是可以顯著地節省記憶體空間。
但一般這種例子算比較少見,大多在呼叫 substring() 後,原字串就不需要了,而這時就會造成記憶體空間的浪費。
Java 7 的優點就反過來,不需要原字串的狀況可以節省記憶體,但當需要眾多不同組合的子字串時,就會產生額外的記憶體空間的消耗~。

參考資料:
1、The substring() Method in JDK 6 and JDK 7

沒有留言: