为什么在Dart中使用StringBuffer而不是Iterable.join?

时间:2013-08-23 07:55:07

标签: dart

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

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

3 个答案:

答案 0 :(得分:7)

没有太大的区别。如果您已有字符串列表,则使用StringBuffer.writeAllIterable.join没有区别。 Iterable.join方法使用StringBuffer internaly:

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

Dart documentation(点击右侧的代码按钮)。

答案 1 :(得分:1)

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

Seth Lad在博客中写了一些有关数字的好处here来支持它。

有关此here的类似博文。

答案 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解析等),这确实很有帮助。在这些情况下,它被反复调用数万或数十万次,在特定情况下,我可以将整个解析时间减少到一半左右。