2012-02-10 40 views
1

在阅读关于字符串的android文档之后,其中包括:StringBuilder.substring(..)是否创建一个新的char []?

此类使用char []实现。该数组的长度可能会超过字符串的长度 。例如,字符串“Hello”可能由数组['H','e','l','l','o','W')支持。 'o','r','l', 'd'],偏移量为0,长度为5.

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

所以我的问题是:当我们创建一个String作为StringBuilder的子串时会发生什么?是否还有任何内存方面的考虑? 这导致我的另一个问题: 组合StringBuilder /字符串是一个很好的选择,当选择大型文本的小部分和编程时考虑到快速性考虑?

谢谢你的关注和你的时间,祝你有美好的一天!

回答

2

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

其实,你的想法如何检查,这里有如何让Dalvik的来源说明:http://source.android.com/source/downloading.html

+0

我对 [链接](HTTP去://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/lang/AbstractStringBuilder.java.html) 看到源代码,我们可以看到返回的字符串是这样创建的: “返回新的字符串(值,开始,结束 - 开始)” 根据android文档确实导致一个新的char []正在创建这个字符串。 感谢您的帮助! – 2012-02-10 22:00:32

+0

太棒了,不客气。现在我也知道了:) – 2012-02-10 22:21:35

相关问题