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

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

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

why string is immutable in Java, why string is immutable and final in java
    1. 在Java中,字符串池只能存在是因为String是不可变的。这样一来,Java Runtime就可以节省大量的堆空间,因为不同的字符串变量可以引用池中相同的字符串变量。如果String不是不可变的,那么字符串池就无法存在,因为如果任何一个变量改变了值,那么其他变量中的值也会发生变化。

如果String不是不可变的,就会给应用程序带来严重的安全威胁。例如,数据库的用户名和密码被作为字符串传递以获取数据库连接,在套接字编程中,主机和端口细节也被作为字符串传递。由于String是不可变的,其值不能被更改,否则任何黑客都可以更改所引用的值,从而在应用程序中引发安全问题。

由于String是不可变的,它在多线程中是安全的。单个String实例可以在不同的线程之间共享。这避免了为了线程安全而使用的同步。字符串默认是线程安全的。

字符串在Java类加载器中被使用,不可变性提供了保证正确类被ClassLoader加载的安全性。例如,想象一下,你试图加载java.sql.Connection类,但是被更改为myhacked.Connection类,它可以对你的数据库做一些不必要的事情。

由于String是不可变的,在创建时它的哈希码就被缓存起来,不需要再次计算。这使得String成为Map中的优秀候选键,并且与其他HashMap键对象相比,其处理速度更快。这就是为什么String被广泛用作HashMap的键的原因。

上面是我能想到的一些显示字符串不可变性好处的原因。这是Java String类的一个很好的特性,使它变得特殊。阅读本文以了解如何编写自己的不可变类。

你可以从我们的GitHub仓库中获取更多Java String的例子。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds