String类为什么要设计成final型
1.确保了字符串池的不可变性
因为String对象缓存在String池中,由于缓存区的字符串在多个客户之间共享,因此始终存在风险,一个用户的操作就会影响其他用户。假如String不是final型的,那每一个用户都可以随意更改字符串的值,会导致每个用户看到的当前值发生改变。因此将String设计成final型就可避免这种风险。
2.其他类的需要(HashMap)
将String设计成final型,就不能通过扩展和覆盖行为来破坏String类的不可变性、缓存、散列值等。所以将字符串作为HashMap的键是一个很好的选择,对于键值来说,最重要的是不可变,以便于用它检索存储在HashMap中值的对象。HashMap内部存储是散列,因此需要具有相同的值才能正常运行。如果在插入后修改了String的内容,可变的String将在插入和检索时生成不同的哈希值,可能会导致map中数据丢失。
3.线程安全
String对象是不可变的,它就可以安全地共享许多线程,并且避免了java中同步问题,不变性也使得String实例在java中是线程安全地,不需要做外部同步操作。
4.被类加载机制使用
如果 String 是可变的,加载“java.io.Writer” 的请求可能已被更改为加载 “mil.vogoon.DiskErasingWriter”. 安全性和字符串池是使字符串不可变的主要原因
5.字符串已被广泛用作许多 Java 类的参数
字符串已被广泛用作许多 Java 类的参数,例如,为了打开网络连接,你可以将主机名和端口号作为字符串传递,你可以将数据库 URL 作为字符串传递, 以打开数据库连接,你可以通过将文件名作为参数传递给 File I/O 类来打开 Java 中的任何文件。如果 String 不是不可变的,这将导致严重的安全威胁,我的意思是有人可以访问他有权授权的任何文件,然后可以故意或意外地更改文件名并获得对该文件的访问权限。由于不变性,你无需担心这种威胁。这个原因也说明了,为什么 String 在 Java 中是最终的,通过使 java.lang.String final,Java设计者确保没有人覆盖 String 类的任何行为。