【问题标题】:Why to use StringBuffer in Dart instead of Iterable.join?为什么在 Dart 中使用 StringBuffer 而不是 Iterable.join?
【发布时间】:2013-08-23 07:55:07
【问题描述】:

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

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

【问题讨论】:

    标签: dart


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      Seth Lad 在博客中谈到了 here 的好处,并附有一些数字来支持它。

      关于此here 有一篇类似的博客文章。

      【讨论】:

      • 抱歉,这不是我的问题的答案。我明白,StringBuffer 比使用+ 连接更有效,但问题是关于Iterable.joinStringBuffer
      【解决方案3】:

      不是一个直接的答案,但它仍然可能对某些人有所帮助(就像我来到这里时试图从这些建设者那里获得最大收益)。我看到像这样的自定义构建的字符串缓冲区有相当大的加速:

      如果你能负担得起容量上限(没有范围检查,如果需要,请添加):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 2018-09-07
        • 2012-03-18
        • 2011-09-11
        • 2019-02-14
        • 2018-02-27
        • 2016-12-17
        相关资源
        最近更新 更多