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

为什么在Dart中使用StringBuffer而不是Iterable.join?,dart,Dart,在Dart中,可以通过两种方式有效地连接字符串:可以使用StringBuffer类,然后将其转换为字符串;也可以将所有子字符串放入列表中,然后对其调用join(“”) 我不明白,StringBuffer的优点是什么,为什么我应该使用它而不是加入列表。有人能解释一下吗?StringBuffer效率更高,因为它在您调用toString之前不会创建string对象 Seth Lad在博客上写了一些数字来支持它 关于这一点,也有类似的博客帖子。没有太大区别。如果已经有字符串列表,则使用StringBuf

在Dart中,可以通过两种方式有效地连接字符串:可以使用StringBuffer类,然后将其转换为字符串;也可以将所有子字符串放入列表中,然后对其调用join(“”)


我不明白,StringBuffer的优点是什么,为什么我应该使用它而不是加入列表。有人能解释一下吗?

StringBuffer效率更高,因为它在您调用toString之前不会创建string对象

Seth Lad在博客上写了一些数字来支持它


关于这一点,也有类似的博客帖子。

没有太大区别。如果已经有字符串列表,则使用
StringBuffer.writeAll
Iterable.join
没有区别。
Iterable.join
方法在内部使用
StringBuffer

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

从(单击右侧的代码按钮)。

这不是一个直接的答案,但它可能仍然会帮助一些人(就像我一样,我来到这里时,正试图从这些构建者那里获得最大的好处)。我看到定制的字符串缓冲区大大提高了速度,如下所示:

如果您负担得起容量上限(无范围检查,需要时添加):

类StringBuilder{
列表str;
int位置=0;
StringBuilder(整数容量){
str=列表(容量);
}
无效清除(){
位置=0;
}
@凌驾
String-toString()=>String.fromCharCodes(str,0,位置);
无效写入(字符串s){
对于(s.codeUnits中的int ch)str[position++]=ch;
}
无效写入代码(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);
  }
}
类StringBuilder{
列表str;
StringBuilder(){
str=[];
}
无效清除(){
str.clear();
}
@凌驾
String to字符串()=>String.fromCharCodes(str);
无效写入(字符串s){
str.addAll(s.codeUnits);
}
无效写入代码(int ch){
str.add(ch);
}
}

我在格式转换器中使用了它们,格式转换器必须进行大量的字符串操作(想想XML解析和类似的操作),这确实很有帮助。在这些情况下,它会被反复调用几十次或几十万次,在特定情况下,我可以将整个解析时间减少到一半左右。

对不起,这不是我问题的答案。我确实理解,StringBuffer比使用
+
连接更有效,但问题是关于
Iterable.join
vs
StringBuffer
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);
  }
}