在Dart中,您可以通过两种方式有效地连接字符串:您可以使用StringBuffer类然后将其转换为String,或者您可以将所有子字符串放入List中,然后对它们调用join('')。
我不明白,StringBuffer的优点是什么?我为什么要使用它而不是加入List。有人可以解释一下吗?
答案 0 :(得分:7)
没有太大的区别。如果您已有字符串列表,则使用StringBuffer.writeAll
或Iterable.join
没有区别。 Iterable.join
方法使用StringBuffer
internaly:
String join([String separator = ""]) {
StringBuffer buffer = new StringBuffer();
buffer.writeAll(this, separator);
return buffer.toString();
}
从Dart documentation(点击右侧的代码按钮)。
答案 1 :(得分:1)
答案 2 :(得分:0)
这不是一个直接的答案,但它可能仍然对某些人有帮助(就像我在这里尝试从这些建筑商那里获得最大收益的时候一样)。我看到了使用这样的自定义构建的字符串缓冲区的相当大的加速:
如果您可以承受容量上限(不检查范围,请根据需要添加):
class StringBuilder {
List<int> str;
int position = 0;
StringBuilder(int capacity) {
str = List<int>(capacity);
}
void clear() {
position = 0;
}
@override
String toString() => String.fromCharCodes(str, 0, position);
void write(String s) {
for (int ch in s.codeUnits) str[position++] = ch;
}
void writeCharCode(int ch) {
str[position++] = ch;
}
}
如果不能:
class StringBuilder {
List<int> str;
StringBuilder() {
str = <int>[];
}
void clear() {
str.clear();
}
@override
String toString() => String.fromCharCodes(str);
void write(String s) {
str.addAll(s.codeUnits);
}
void writeCharCode(int ch) {
str.add(ch);
}
}
我在格式转换器中使用了它们,这些转换器必须执行很多字符串操作(请考虑XML解析等),这确实很有帮助。在这些情况下,它被反复调用数万或数十万次,在特定情况下,我可以将整个解析时间减少到一半左右。