当前位置: 首页 > 面试题库 >

为什么字符串在许多编程语言中都是不可变的?

杜焕
2023-03-14
问题内容

为此选择了几种语言,例如C#,Java和Python。如果要节省内存或为进行诸如 compare之类的 操作提高效率,这对串联和其他修改操作有什么影响?


问题答案:

不变类型通常是一件好事:

  • 它们在并发方面更好地工作(您不需要锁定无法更改的内容!)
  • 它们减少错误:易变的对象很容易在不希望更改的情况下被更改,因为它可能会引入各种奇怪的错误(“远距离操作”)
  • 可以安全地共享它们(即对同一对象的多个引用),这可以减少内存消耗并提高缓存利用率。
  • 如果必须对可变对象进行防御性复制,则共享还会使复制非常便宜的O(1)操作成为O(n)。这很重要,因为复制是一项非常普通的操作(例如,每当您要传递参数时……)。

因此,使字符串不可变是一种非常合理的语言设计选择。

某些语言(尤其是功能语言,例如Haskell和Clojure)走得更远,几乎使所有内容变得不可变。如果您对不变性的好处感兴趣,那么这部启发性视频非常值得一看。

不可变类型有一些小的缺点:

  • 创建诸如连接之类的已更改字符串的操作会更加昂贵,因为您需要构造新对象。通常,连接两个不可变字符串的成本为O(n + m),但是如果使用像Rope这样基于树的字符串数据结构,成本可能会低至O(log(m + n))。另外,如果您确实需要有效地连接字符串,则始终可以使用Java的StringBuilder之类的特殊工具。
  • 在大字符串上进行小的更改可能会导致需要构造大字符串的全新副本,这显然会增加内存消耗。但是请注意,在垃圾回收语言中这通常不是大问题,因为如果您不保留对旧副本的引用,旧副本将很快收集垃圾。

总体而言,不变性的优点远远大于次要的缺点。即使您只对性能感兴趣,但复制的并发优势和廉价通常会使不可变字符串比具有锁定和防御性复制的可变字符串更具性能



 类似资料:
  • 本文向大家介绍为什么字符串对象在Java中是不可变的?,包括了为什么字符串对象在Java中是不可变的?的使用技巧和注意事项,需要的朋友参考一下 通常,字符串用于表示重要细节,例如数据库连接URL,用户名密码等。字符串的不变性有助于使这些细节保持不变。 类似地,在加载类时,将String用作参数。那时,更改字符串可能会导致加载错误的类。 如果不可变,则变量(字符串)自动为线程安全的。

  • 问题内容: 他们为什么决定使用 Java和.NET(和其他一些语言)使其不可变?他们为什么不使它可变? 问题答案: 根据Effective Java第四章第73页第2版: “这样做有很多充分的理由:不可变的类比可变的类更易于设计,实现和使用。它们不易出错且更安全。 […] “ 不可变对象很简单。不可变对象可以恰好处于一种状态,即创建时的状态。如果确保所有构造函数都建立类不变式,则可以保证这些不变式

  • 我是java编程的新手。而且我不明白为什么string对象在Java中是不可变的。

  • 正式学习 Python 之前,我们有必要先搞清楚【 编程语言】这个概念。 在我们很小的时候,父母就教我们开口说话,也教我们如何理解别人讲话的意思。经过长时间的熏陶和自我学习,我们在不知不觉中学会了说话,也能听懂其他小朋友说话的意思,于是我们开始用语言与他人交流。 世界上存在许多种语言,包括汉语、英语、日语、俄语等等,每种语言都有固定的格式,比如汉语(中国话),每个汉字代表着不同的意思,我们必须正确

  • 据我所知, 可变字符串可以更改,不可变字符串不能更改。 这里我想这样改变字符串的值, 另一种方法是, 在这两种情况下,我都试图改变str的值。谁能告诉我,这两种情况的区别是什么,让我清楚地了解可变和不可变对象。