为什么他们决定在Java和.NET(以及其他一些语言)中使字符串不可变?他们为什么不让它变得可变?
请考虑以下代码:
$ irb
> s = "asd"
> s.object_id   # prints 2171223360
> s[0] = ?z     # s is now "zsd"
> s.object_id   # prints 2171223360 (same as before)
> s += "hello"  # s is now "zsdhello"
> s.object_id   # prints 2171224560 (now it's different)
似乎可以在不创建新字符串的情况下更改单个字符.但是,附加到字符串显然会创建一个新字符串.
Ruby中的字符串是否可变?
我通过工作我的方式项目欧拉,跑进一个稍微令人惊讶的疏漏:没有String#shift,unshift,push,或pop.我假设String被认为是一个像"数组"一样的"顺序"对象,因为它们具有索引和迭代的能力,并且这包括轻松更改对象的开头和结尾的能力.
我知道有很多方法可以创造同样的效果,但有一个特殊的原因,串并不会有这些方法?
有些语言(C#或Java)具有不可变字符串,而其他语言(例如Ruby)具有可变字符串.这些设计选择背后的原因是什么?