2011-10-02 45 views
3

使用分析,我似乎可以看到一個蘋果的1.6 Java中的以下內容:子和垃圾在Java 1.6

我開始適度長Java字符串。我使用String.split("\\W+")將它分成令牌。該代碼然後保存對一些拆分片段的引用。

看來,如果我相信我的眼睛在yourkit中,那麼Java有幫助而不是複製這些字符串,以便我實際上持有對冗長原件的引用。在我的情況下,這會導致相當大的空間浪費。

這看起來似乎合理嗎?很容易添加一個循環制作這些人的副本。

+1

您的懷疑是正確的。請參閱Jon Skeet對http://blogs.msdn.com/b/ericlippert/archive/2011/07/19/strings-immutability-and-persistence.aspx的評論 – SLaks

+0

String.substring也是如此 – Joel

+0

相關:[什麼是在Java中使用表達式「new String(...)」的目的是什麼?](http://stackoverflow.com/questions/390703) – McDowell

回答

4

String.split()不會複製String [新對象...]的部分,而是使用了String的領域:offsetcount。通過「更改」它們,稍後訪問String對象時,可以通過將偏移量添加到原始參考來完成。這確實是爲了防止複製整個String,並節省空間[至少通常...]。
所以基本上是的。所有新對象在原始String中將具有相同的char[]參考,這將導致原始char[]