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