我理解String和StringBuilder之间的区别(StringBuilder是可变的),但两者之间有很大的性能差异吗?
我正在工作的程序有很多case驱动的字符串追加(500+)。使用StringBuilder是更好的选择吗?
我理解String和StringBuilder之间的区别(StringBuilder是可变的),但两者之间有很大的性能差异吗?
我正在工作的程序有很多case驱动的字符串追加(500+)。使用StringBuilder是更好的选择吗?
当前回答
作为一般的经验法则,如果我必须设置字符串的值不止一次,或者如果字符串有任何追加,那么它需要是一个字符串构建器。在了解字符串构建器之前,我曾经看到我过去编写的应用程序具有巨大的内存足迹,而且似乎一直在不断增长。将这些程序更改为使用字符串构建器可以显著减少内存使用。现在我对琴弦制造者发誓。
其他回答
为了澄清Gillian所说的4弦,如果你有这样的东西:
string a,b,c,d;
a = b + c + d;
那么使用字符串和加号运算符会更快。这是因为(就像Eric指出的Java一样),它在内部自动使用StringBuilder(实际上,它使用StringBuilder也使用的原语)
但是,如果你正在做的事情接近:
string a,b,c,d;
a = a + b;
a = a + c;
a = a + d;
然后你需要显式地使用一个StringBuilder。. net在这里不会自动创建一个StringBuilder,因为这毫无意义。在每行的末尾,"a"必须是一个(不可变的)字符串,因此它必须在每行上创建和释放一个StringBuilder。为了提高速度,你需要使用相同的StringBuilder,直到你完成构建:
string a,b,c,d;
StringBuilder e = new StringBuilder();
e.Append(b);
e.Append(c);
e.Append(d);
a = e.ToString();
从内存的角度来看,StringBuilder的性能会更好。至于处理,执行时间的差异可以忽略不计。
是的,StringBuilder在对字符串执行重复操作时提供了更好的性能。这是因为所有的更改都是对单个实例进行的,因此它可以节省大量时间,而不是像String那样创建一个新实例。
String Vs Stringbuilder
字符串 系统命名空间下 不可变(只读)实例 当价值发生持续变化时,性能下降 线程安全的 StringBuilder(可变字符串) 在系统。文本名称空间 可变的实例 显示更好的性能,因为对现有实例进行了新的更改
强烈推荐dotnet mob文章:c#中的String Vs StringBuilder。 相关堆栈溢出问题:字符串时的可变性 在c#中没有改变?
字符串Vs字符串生成器:
你要知道的第一件事是这两个类生活在哪个汇编中?
So,
字符串出现在系统命名空间中。
and
StringBuilder出现在系统中。文本名称空间。
对于字符串声明:
您必须包括System名称空间。 就像这样。 使用系统;
and
对于StringBuilder声明:
你必须包括系统。文本名称空间。 就像这样。 使用text;
现在真正的问题来了。
string和StringBuilder之间的区别是什么?
两者的主要区别在于:
字符串是不可变的。
and
StringBuilder是可变的。
现在让我们讨论一下immutable和mutable的区别
Mutable::意思是可变的。
Immutable::表示不可更改。
例如:
using System;
namespace StringVsStrigBuilder
{
class Program
{
static void Main(string[] args)
{
// String Example
string name = "Rehan";
name = name + "Shah";
name = name + "RS";
name = name + "---";
name = name + "I love to write programs.";
// Now when I run this program this output will be look like this.
// output : "Rehan Shah RS --- I love to write programs."
}
}
}
在这种情况下,我们要将同一个对象改变5次。
所以显而易见的问题是!当我们修改同一个字符串5次时,实际上发生了什么。
这就是当我们改变同一个字符串5次时发生的情况。
让我们看一下图表。
解释:
当我们第一次将变量name初始化为Rehan时i-e string name = "Rehan" 这个变量被创建在堆栈“name”上,并指向“Rehan”值。 "name = name + "Shah"。引用变量不再指向对象“Rehan”,而是指向“Shah”,以此类推。
string是不可变的意思是一旦我们在内存中创建了对象我们就不能改变它们。
因此,当我们连接name变量时,前一个对象仍然在内存中,另一个新的字符串对象被创建。
所以从上图中我们有五件物品,四件物品被扔掉了,它们根本不用。它们仍然保留在内存中,并占据一定的内存容量。 “垃圾回收器”负责清理内存中的资源。
在字符串的情况下,当我们反复操作字符串时我们有很多对象被创建并留在内存中。
这就是字符串变量的故事。
现在让我们看看StringBuilder对象。 例如:
using System;
using System.Text;
namespace StringVsStrigBuilder
{
class Program
{
static void Main(string[] args)
{
// StringBuilder Example
StringBuilder name = new StringBuilder();
name.Append("Rehan");
name.Append("Shah");
name.Append("RS");
name.Append("---");
name.Append("I love to write programs.");
// Now when I run this program this output will be look like this.
// output : "Rehan Shah Rs --- I love to write programs."
}
}
}
在这种情况下,我们要将同一个对象改变5次。
所以显而易见的问题是!当我们修改同一个StringBuilder 5次时,实际上发生了什么。
这就是当我们修改同一个StringBuilder 5次时所发生的情况。
让我们看一下图表。
解释: 对于StringBuilder对象。你不会得到新对象。同一个对象会在内存中发生变化,所以即使你改变对象10000次,我们仍然只有一个stringBuilder对象。
你没有很多垃圾对象或非_referenced stringBuilder对象,因为它可以被更改。它是可变的意思是它会随着时间变化?
差异:
字符串存在于系统命名空间中,其中Stringbuilder存在 在系统。文本名称空间。 string是不可变的,而StringBuilder是可变的。
如果你要做很多字符串连接,使用StringBuilder。当您连接一个String时,每次都会创建一个新的String,这会占用更多的内存。
Alex