在 Dart 中,您可以通过两种方式有效地连接字符串:您可以使用 StringBuffer 类,然后将其转换为字符串,或者您可以将所有子字符串放入 List 中,然后对它们调用 join('')。
我不明白,StringBuffer 的优点是什么,为什么要使用它而不是加入 List。有人可以解释一下吗?
在 Dart 中,您可以通过两种方式有效地连接字符串:您可以使用 StringBuffer 类,然后将其转换为字符串,或者您可以将所有子字符串放入 List 中,然后对它们调用 join('')。
我不明白,StringBuffer 的优点是什么,为什么要使用它而不是加入 List。有人可以解释一下吗?
没有什么大的区别。StringBuffer.writeAll
如果您已经有一个字符串列表,那么使用or没有区别Iterable.join
。该Iterable.join
方法使用StringBuffer
内部:
String join([String separator = ""]) {
StringBuffer buffer = new StringBuffer();
buffer.writeAll(this, separator);
return buffer.toString();
}
来自Dart 文档(单击右侧的代码按钮)。
不是一个直接的答案,但它仍然可能对某些人有所帮助(就像我来到这里时试图从这些建筑商那里获得最大收益)。我看到自定义构建的字符串缓冲区有相当大的加速,如下所示:
如果您负担得起容量上限(没有范围检查,如果需要,请添加):
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 解析等)的格式转换器中使用它们,它确实很有帮助。在这些情况下,它会被重复调用数万或数十万次,在特定情况下,我可以将整个解析时间减少到一半左右。