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

时间:2020-02-23 14:37:26  来源:igfitidea点击:

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

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

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

  • 仅因为Java中的String是不可变的,才可能使用String pool。
    这样,Java运行时可以节省大量堆空间,因为不同的String变量可以引用池中的同一String变量。
    如果String不会是不可变的,那么String实习将是不可能的,因为如果有任何变量更改了值,那么它也将反映在其他变量中。

  • 如果String不可更改,那么它将对应用程序造成严重的安全威胁。
    例如,数据库用户名,密码作为String传递以获取数据库连接,并在套接字编程中以String形式传递主机和端口详细信息。
    由于String是不可变的,因此其值无法更改,否则任何黑客都可以更改引用的值,从而在应用程序中引起安全问题。

  • 由于String是不可变的,因此对于多线程而言是安全的。
    单个String实例可以在不同线程之间共享。
    这避免了为了线程安全而使用同步。
    字符串是隐式线程安全的。

  • 字符串用于java类加载器中,不变性提供了确保类加载器加载正确类的安全性。
    例如,考虑一个实例,您尝试加载java.sql.Connection类,但将引用的值更改为myhacked.Connection类,这可能会对数据库造成不良影响。

  • 由于String是不可变的,因此其哈希码会在创建时进行缓存,因此无需再次计算。
    这使其成为Map中密钥的理想候选者,并且其处理比其他HashMap密钥对象更快。
    这就是为什么String最广泛用作HashMap键的原因。

以上是我想到的一些原因,这些原因表明了字符串不可变的好处。
它是Java String类的一个强大功能,并且使其与众不同。