讨论String为什么要设计为final类

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 类的任何行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值