可能重复:
Why can't strings be mutable in Java and .NET?
有几种语言可供选择,例如C#、Java和Python语言。如果它的目的是为了节省内存或提高比较等操作的效率,那么它对连接和其他修改操作有什么影响?
发布于 2012-03-03 14:56:13
不可变类型通常是一件好事:
因此,使字符串不可变是一种非常合理的语言设计选择。
有些语言(特别是像Haskell和Clojure这样的函数式语言)走得更远,几乎使所有东西都是不可变的。如果你对不变性的好处感兴趣,这个enlightening video非常值得一看。
不可变类型有几个小缺点:
创建像连接这样的更改字符串的
但总体而言,不变性的优点远远大于次要缺点。即使你只对性能感兴趣,复制的并发优势和廉价通常会使不变的字符串比具有锁定和防御性复制的可变字符串具有更高的性能。
发布于 2012-03-03 15:03:34
它主要是为了防止编程错误。例如,字符串经常用作哈希表中的键。如果它们可以改变,哈希表就会被破坏。这只是一个例子,当你使用一段数据时改变了它会导致问题。安全性是另一个问题:如果在执行用户请求的操作之前检查是否允许用户访问位于给定路径的文件,则包含该路径的字符串最好不是可变的……
当你在做多线程的时候,它变得更加重要。不可变的数据可以在线程之间安全地传递,而可变的数据会造成无尽的麻烦。
基本上,不可变数据使得处理它的代码更容易推理。这就是为什么纯函数式语言试图保持所有东西都不变的原因。
发布于 2012-03-03 15:17:26
在Java中,不仅String,而且所有的原始包装类(Integer、Double、Character等)都是不可变的。我不确定确切的原因,但我认为这些是所有编程方案都工作的基本数据类型。如果他们改变了,事情可能会变得很疯狂。更具体地说,我将使用一个示例:假设您打开了一个到远程主机的套接字连接。主机名将是字符串,端口将是Integer。如果在建立连接后修改了这些值,该怎么办?
就性能而言,Java从一个单独的内存区(称为字面池)为这些类分配内存,而不是从堆栈或堆分配内存。文字池被编入索引,如果您使用字符串" string“两次,它们指向文字池中的同一对象。
https://stackoverflow.com/questions/9544182
复制相似问题