10

在 Dart 中,您可以通过两种方式有效地连接字符串:您可以使用 StringBuffer 类,然后将其转换为字符串,或者您可以将所有子字符串放入 List 中,然后对它们调用 join('')。

我不明白,StringBuffer 的优点是什么,为什么要使用它而不是加入 List。有人可以解释一下吗?

4

3 回答 3

14

没有什么大的区别。StringBuffer.writeAll如果您已经有一个字符串列表,那么使用or没有区别Iterable.join。该Iterable.join方法使用StringBuffer内部:

String join([String separator = ""]) {
 StringBuffer buffer = new StringBuffer();
 buffer.writeAll(this, separator);
 return buffer.toString();
}

来自Dart 文档(单击右侧的代码按钮)。

于 2013-08-23T08:22:07.247 回答
0

StringBuffer 效率更高,因为它在调用 toString 之前不会创建字符串对象。

Seth Lad 在博客中介绍了这里的好处,并提供了一些数据来支持它。

这里有一篇类似的博客文章。

于 2013-08-23T08:02:17.487 回答
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 解析等)的格式转换器中使用它们,它确实很有帮助。在这些情况下,它会被重复调用数万或数十万次,在特定情况下,我可以将整个解析时间减少到一半左右。

于 2020-10-17T11:25:59.973 回答