为什么 Java 中的字符串是不可变的?
为什么 String 在 Java 中是不可变的,这是常见的面试问题之一。字符串是任何编程语言中最常用的类之一。我们知道 String 在 Java 中是不可变的和最终的。Java 运行时维护一个String 池,使其成为一个特殊的类。
为什么 Java 中的 String 是不可变的?
让我们看看字符串不变性的一些好处,这将有助于理解为什么字符串在 Java 中是不可变的。
- 字符串池之所以可行,是因为 String 在 Java 中是不可变的。这样,Java 运行时可以节省大量堆空间,因为不同的 String 变量可以引用池中的同一个 String 变量。如果 String 不是不可变的,那么 String 驻留就不可能实现,因为如果任何变量改变了值,它也会反映在其他变量中。
- 如果字符串不是不可变的,那么它将对应用程序造成严重的安全威胁。例如,数据库用户名、密码作为字符串传递以获取数据库连接,在套接字编程中,主机和端口详细信息作为字符串传递。由于字符串是不可变的,因此其值不能更改,否则任何黑客都可以更改引用的值,从而导致应用程序的安全问题。
- 由于 String 是不可变的,因此对于多线程而言是安全的。单个 String 实例可以在不同的线程之间共享。这避免了使用同步来确保线程安全。字符串是隐式线程安全的。
- 字符串用于Java 类加载器,不变性可确保类加载器加载正确的类。例如,设想这样一个实例,您尝试加载
java.sql.Connection
类,但引用的值已更改myhacked.Connection
为可能对您的数据库造成不良影响的类。 - 由于 String 是不可变的,因此它的哈希码在创建时就被缓存了,不需要再次计算。这使得它成为 Map 中键的绝佳候选,并且它的处理速度比其他 HashMap 键对象更快。这就是为什么 String 被最广泛地用作 HashMap 键的原因。
以上是我能想到的一些表明字符串不变性的好处的原因。这是Java String 类的一大特性,也让它变得特别。阅读这篇文章,了解如何编写自己的不可变类。
您可以从我们的GitHub 存储库中查看更多 Java 字符串示例。