为什么在Java中字符串是不可变的?

为什么在Java中String是不可变的是一个常见的面试问题。String是任何编程语言中最常用的类之一。我们知道String在Java中是不可变的和final的。Java运行时维护了一个字符串池,使其成为一个特殊的类。

为什么在Java中String是不可变的?

让我们来看看String不可变性的一些好处,这将有助于理解为什么String在Java中是不可变的。

  1. 在Java中String是不可变的,这样才能实现字符串池。这样,Java运行时可以节省大量的堆空间,因为不同的String变量可以引用池中相同的String变量。如果String不是不可变的,那么字符串池就无法实现,因为如果任何变量改变了值,它将反映在其他变量中。
  2. 如果String不是不可变的,那么它将对应用程序造成严重的安全威胁。例如,数据库用户名、密码被作为String传递以获取数据库连接,在套接字编程中主机和端口详细信息也被作为String传递。由于String是不可变的,其值无法更改,否则任何黑客都可以更改引用值以在应用程序中造成安全问题。
  3. 由于String是不可变的,所以对于多线程来说是安全的。单个String实例可以在不同的线程之间共享。这避免了对线程安全性进行同步。字符串隐式地是线程安全的。
  4. 字符串被用于Java类加载器,不可变性提供了安全性,确保正确的类由类加载器加载。例如,想象一下,当您尝试加载java.sql.Connection类时,但引用值被更改为myhacked.Connection类,它可能对您的数据库做一些不需要的事情。
  5. 由于String是不可变的,所以它的哈希码在创建时被缓存,不需要再次计算。这使得它成为Map中的一个很好的键的候选,并且其处理速度比其他HashMap键对象要快。这就是为什么String作为HashMap键最广泛使用的原因。

以下是我能想到的一些表明字符串不可变性的好处。这是Java String类的一个很棒的特性,使其变得特殊。阅读这篇文章以了解如何编写你自己的不可变类

你可以从我们的GitHub代码库中查看更多Java String的示例。

Source:
https://www.digitalocean.com/community/tutorials/string-immutable-final-java