为什么String在 java 中是不可变的? 这是一个受欢迎的面试问题。 字符串是任何编程语言中使用最多的类之一。 我们知道 String 在 java 和 java 运行时是不可变(immutable )和最终(final)的,使用 String pool来维护,使它成为一个特殊类。
让我们来看看字符串不可变性的一些好处,这些好处有助于我们来理解为什么 String 在 java 中是不可变的:
- 1.由于 String 在 Java 中是不可变的,这样 Java Runtime 就可以节省大量的 Java 堆空间,因为不同的 String 变量可以在
String Pool
中引用相同的 String 变量(实际String对象的值)。 - 2.如果String不是不可变的,那么它将对应用程序造成严重的安全威胁。 例如,数据库用户名,密码作为String传递以获取数据库连接.如果String是可变的,黑客可以轻松改变它的引用值以导致应用程序中出现安全问题。
- 3.由于String是不可变的,所以它在
多线程环境(multithreading)
是线程安全的,一个 String 实例可以在不同的线程中共享。 这避免了使用同步(synchronization)
来保护线程安全,String是隐式线程安全的. - 4.String被用在了classloader 类加载器中,不可变性提供了正确的类由Classloader加载的安全性。 例如,假设您尝试加载java.sql.Connection类的实例,但引用的值更改为myhacked.Connection类,可以对数据库执行有害的操作。
- 5.由于 String 是不可变的,它的 hashcode 在创建时就被缓存了,它不需要再次计算,并且它的处理速度比其他 Object对象要快。这也是
为什么 HashMap 常用 String 对象作 key的原因
引申阅读: 如何设计一个不可变类(immutable class)?