在连接或字符串构建期间使用 StringBuilder 而不是 String 的好处
Benefits using StringBuilder rather than String during concatenation or String Building
这是我正在研究的 C# 中的字符串反转方法:
string s = "This is the way it is.";
string result = string.Empty;
for(int i = s.Length-1; i <= 0; i--)
{
result = result + s[i];
}
return result;
假设字符串可以变得非常非常长。为什么在这种情况下使用 Stringbuilder
优于如上所示使用 s[i]
连接结果?
是否因为 result 和 s[i]
都是不可变字符串,因此每次查找它们都会创建一个对象?导致创建大量对象并需要对所有这些对象进行垃圾回收?
提前感谢您抽出时间。
没有。不是他们两个。本例中的两个字符串都是不可变的。但是,在 for 循环中,创建了一个新的 result
字符串对象,但没有创建 s
字符串对象,因为它没有被更新,我们只是访问它。在赋值之后,我们有之前的 result
对象无法辨认垃圾回收,因为它正在丢失引用但不是 s
字符串对象。在下一次迭代中,当前新的 result
String 对象将被垃圾收集等。如果你使用了字符串生成器,你会有不同的情况。
result = result + s[i];
与字符串不同,stringbuilder 是可变的。因此,如果您的 result
变量是 Stringbuilder 类型,则不会创建新的 result
对象,而是根据分配更新现有对象。
StringBuilder 是可变的。这意味着它在修改它时不会创建新对象。
您可以在此阅读更多内容 page
这是我正在研究的 C# 中的字符串反转方法:
string s = "This is the way it is.";
string result = string.Empty;
for(int i = s.Length-1; i <= 0; i--)
{
result = result + s[i];
}
return result;
假设字符串可以变得非常非常长。为什么在这种情况下使用 Stringbuilder
优于如上所示使用 s[i]
连接结果?
是否因为 result 和 s[i]
都是不可变字符串,因此每次查找它们都会创建一个对象?导致创建大量对象并需要对所有这些对象进行垃圾回收?
提前感谢您抽出时间。
没有。不是他们两个。本例中的两个字符串都是不可变的。但是,在 for 循环中,创建了一个新的 result
字符串对象,但没有创建 s
字符串对象,因为它没有被更新,我们只是访问它。在赋值之后,我们有之前的 result
对象无法辨认垃圾回收,因为它正在丢失引用但不是 s
字符串对象。在下一次迭代中,当前新的 result
String 对象将被垃圾收集等。如果你使用了字符串生成器,你会有不同的情况。
result = result + s[i];
与字符串不同,stringbuilder 是可变的。因此,如果您的 result
变量是 Stringbuilder 类型,则不会创建新的 result
对象,而是根据分配更新现有对象。
StringBuilder 是可变的。这意味着它在修改它时不会创建新对象。 您可以在此阅读更多内容 page