c# - 在连接或字符串构建期间使用 StringBuilder 而不是 String 的好处
问题描述
这是我正在研究的 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]
是不是因为结果和s[i]
都是不可变的字符串,因此每次查找它们时都会创建一个对象?导致创建大量对象并且需要垃圾收集所有这些对象?
提前感谢您的时间。
解决方案
不。不是他们两个。在这种情况下,两个字符串都是不可变的。但是,查看 for 循环, result
创建了一个新的 String 对象,但不是s
字符串对象,因为它没有被更新,我们只是在访问它。分配后立即,我们有前一个result
对象无法进行垃圾收集,因为它正在丢失引用但不是s
字符串对象。在下一次迭代中,当前新的result
String 对象将被垃圾收集等等。如果你使用过字符串生成器,你会有不同的情况。
result = result + s[i];
与字符串不同,stringbuilder 是可变的。因此,如果您的result
变量是 Stringbuilder 类型,则result
不会创建新对象,而是会根据分配更新现有对象。
推荐阅读
- python - 在ubuntu中找不到sklearn安装的任何错误
- node.js - 找不到命名空间“NodeJS”
- javascript - 单击图像时,我试图从 Sharepoint 列表中检索信息
- transactions - Java:大查询顺序插入的数据流
- python - networkx 边缘返回错误的索引
- javascript - 未调用 Gulp.watch 任务(gulp 4.0.0)
- ios - 从 Files 应用程序中提取文件时,如何绕过 NSCocoaErrorDomain:257?
- python - 在树莓派问题上使用 python 线程化
- python - 有没有一种pythonic方法来遍历两个列表的差异?
- r - Dplyr:使用 rename() 重命名 tibble 中添加的列未按预期工作