StringBuilder.toString是否保留构建的字符串?

时间:2013-03-31 00:02:32

标签: java android stringbuilder

我正在创建一个StringBuilder来收集我定期刷新到服务器的字符串。如果刷新失败,我想保持字符串下次再试一次,虽然在同一时间我可能会得到额外的字符串发送,必须添加到StringBuilder。

我想知道的是最有效的方法是这样做,因为这是在Android应用程序中完成的,其中电池使用率和CPU使用率是一个大问题。调用StringBuilder的toString()函数是否存储它在内部返回的结果字符串,以便后续调用不必执行复制所有原始字符串的工作?或者如果调用失败,我应该创建一个使用toString()的返回值初始化的新StringBuilder吗?

3 个答案:

答案 0 :(得分:4)

以下是OpenJDK source code for StringBuilder

public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}

带有这些参数的source for the String constructor是:

public String(char value[], int offset, int count) {
    if (offset < 0) {
        throw new StringIndexOutOfBoundsException(offset);
    }
    if (count < 0) {
        throw new StringIndexOutOfBoundsException(count);
    }
    // Note: offset or count might be near -1>>>1.
    if (offset > value.length - count) {
        throw new StringIndexOutOfBoundsException(offset + count);
    }
    this.offset = 0;
    this.count = count;
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}

所以是的,它确实每次创建一个新的String,是的,每次都会复制char[]

重要的是要注意这是toString的一个实现,而另一个实现可能显然不同。

答案 1 :(得分:0)

这将是一个实现细节。由于java字符串是不可变的,因此正确的impl可以选择从StringBuilder.toString()共享或创建新字符串,即使它不是必需的。

正如大家所说,你可以测试一下这对你来说确实是一个真正的性能问题。如果它是一个(笨重)的解决方法是包装StringBuilder并缓存生成的字符串。您可以使用脏标志来指示内容已被修改。

答案 2 :(得分:0)

StringBuilder.toString API表示 new String对象已分配并初始化为包含此对象当前表示的字符序列。