StringBuilder.substring(..)是否创建了一个新的char []?

时间:2012-02-10 16:51:48

标签: java android string

阅读关于String的android文档,其中包括:

  

此类使用char []实现。阵列的长度可以   超过字符串的长度。例如,字符串“Hello”可以   由数组['H','e','l','l','o','W'支持。 'o','r','l',   'd']偏移0和长度5。

     

多个字符串可以共享相同的char [],因为字符串是   不可改变的。 substring(int)方法总是返回一个字符串   共享其源字符串的后备数组。通常这是一个   优化:需要分配的字符数组更少,更少   复制是必要的。但这也可能导致不必要的堆积   保留。采用长串的短子串意味着长   在两个字符串都是垃圾之前,shared char []不会是垃圾。这个   通常在从大输入解析小子串时发生。   为了在必要时避免这种情况,请致电new   字符串(longString.subString(...))。字符串复制构造函数总是如此   确保后备阵列不超过必要的大小。

所以我的问题是:当我们创建一个String作为StringBuilder的子串时会发生什么?还有任何内存考虑因素吗? 这引出了我的另一个问题: 在选择大型文本的小部分时,组合StringBuilder / String是一个很好的选择,并考虑到快速性考虑因素吗?

感谢您的关注和时间,祝您有个美好的一天!

1 个答案:

答案 0 :(得分:2)

这里:AbstractStringBuilder.substring(int, int)(StringBuilder扩展此类)在OpenJDK中完成了你的代码片段中描述的内容:创建一个新的String,以避免为整个字符串调用的子字符串保留内存。让我们希望Dalvik的实施是相同的:)

实际上,您了解如何检查此问题,以下是有关如何获取Dalvik来源的说明:http://source.android.com/source/downloading.html