4

我正在创建一个 StringBuilder 来收集我定期刷新到服务器的字符串。如果刷新失败,我想保留字符串以便下次重试,尽管同时我可能会收到额外的字符串来发送,这些字符串必须添加到 StringBuilder 中。

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

4

3 回答 3

5

这是OpenJDK 源代码StringBuilder

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

具有这些参数的构造函数来源是:String

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,而另一种实现可能明显不同。

于 2013-03-31T00:12:26.933 回答
0

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

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

于 2013-03-31T00:53:01.570 回答
0

StringBuilder.toString API says that a new String object is allocated and initialized to contain the character sequence currently represented by this object.

于 2013-03-31T02:14:15.887 回答