我正在创建一个StringBuilder来收集我定期刷新到服务器的字符串。如果刷新失败,我想保持字符串下次再试一次,虽然在同一时间我可能会得到额外的字符串发送,必须添加到StringBuilder。
我想知道的是最有效的方法是这样做,因为这是在Android应用程序中完成的,其中电池使用率和CPU使用率是一个大问题。调用StringBuilder的toString()函数是否存储它在内部返回的结果字符串,以便后续调用不必执行复制所有原始字符串的工作?或者如果调用失败,我应该创建一个使用toString()的返回值初始化的新StringBuilder吗?
答案 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对象已分配并初始化为包含此对象当前表示的字符序列。