使用分析器,我似乎在 Apple 的 1.6 Java 中看到以下内容:
我从一个中等长度的 Java 字符串开始。我使用 String.split("\\W+")
将它拆分为标记。该代码然后保存对一些拆分部分的引用。
看来,如果我相信我在 yourkit 中的眼睛,Java 没有复制这些字符串很有帮助,所以我实际上持有对冗长原件的引用。在我的例子中,这导致了相当大的空间浪费。
这看起来合理吗?添加一个循环来制作这些家伙的副本非常容易。
最佳答案
String.split()
不复制 String
的部分 [新对象...],而是使用 String
的字段:offset
和 count
。通过“更改”它们,当您稍后访问 String
对象时,它是通过将偏移量添加到原始引用来完成的。这样做确实是为了防止复制整个 String
,并节省空间 [嗯,至少通常...]。
所以基本上是的。您的所有新对象都将具有相同的 char[]
引用,这导致原始 String
中的原始 char[]
。
关于java - java 1.6 中的子字符串和垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629208/