寻找Why .NET String is immutable?
的某些要点的澄清面试问题:为什么字符串不可变
我的回答:所以他们可以更像对象然后是字符数组(错误的我应该有所说的值类型),但即便如此也是部分答案。见上面的链接
采访者:它阻止他们填满googlygoop并返回垃圾加上它可以提高性能。现在,他解释googlygoop的方式使得它看起来像是在谈论某种字符串元数据而且对象(跟踪此元数据的可变字符串会损害性能。 现在让我困惑的是:
更改可变字符串的部分将返回垃圾。 Stringbuilders是可变的,我们改变它们并且永远不会得到垃圾,除非我们把垃圾放进去。他可能指的是通过引用传递给函数并且可能返回意外的结果。还有其他方法可以理解吗?
我认为stringbuilders是性能改进的,因为我们并没有摧毁它们并且每次改变都会重建它们,这反过来会减少对gc的工作量。
此外,我对堆栈溢出答案感到有点困惑:
从那以后,这对我来说似乎是倒退了:还可以节省内存优化。实习和雾化 作为最明显的例子,虽然我们可以做其他版本的 同样的原则。我曾经节省了大约半GB的内存 通过比较不可变对象和替换对重复项的引用 所以他们都指向同一个实例(耗费时间,但是a 分钟的额外启动以节省大量内存是一个 在有问题的情况下表现胜利)。用可变对象 无法完成。
A)如果我宣布
string x = "test";
string y = x;
我正在制作x的副本并将其存储在y中。因此,我基本上只是将我使用的内存加倍,而如果y指向x的内存位置,我只是使用内存创建指向“测试”的指针而不是整个字符串。 因此,我认为上述有意义的唯一方法是,如果我做了类似
的事情string x = "1"
string y = "2"
if dbValue["col'] == x then
treenode[i].text = x
else
treenode[i].text = y
但这并没有多大意义,因为treenode [i] .text仍然只是x的副本而不是指向x在内存中的位置。但是,如果可变对象是引用类型,我们可以在内存中创建对相同字符串的引用,并保存在内存中。
事实上,我没有看到op如何使用不可变字符串来保存半GB。
更新
我发现他所引用的字符串元数据可能会影响性能,例如必须复制字符串[i] = string2 [i]为1000个字符加上必须跟踪数组上的信息(索引,计数等)会影响表现。它可能吗?
我认为我只是不理解某些东西,所以我错过了什么?