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

1.数据共享问题

因为String对象是缓存在String常量池中的,缓存的字符串在多个用户之间是共享的,存在风险,一个用户的修改操作会影响到其他所有用户,比如将“ABC”更改为“abc”,那么所有其他的使用者也会随之变更,所以需要String类不可变来避免这种风险。

2.作为HashMap的键

因为HashMap函数可以储存String字符串作为键,因为HashMap需要使用键经过散列函数变换得到的hashcode,去检索存储在HashMap中的值对象。
如果String是可变的,那么改变了键值,相对应的hashcode也会跟着变化,可能会丢失Map中的值对象。

3.避免参数传递安全威胁

因为在各个方法中,都会用到相对应的字符串作为参数传递,比如打开数据库连接、通过IO类打开指定文件等。
如果String是可变的,可能会被利用,可以通过改变相应字符串去访问其他受保护文件,或者更改文件访问权限等。

4.被类加载机制引用,安全考虑

其实跟第三点的考虑差不多,因为JVM在初始化的时候,会用到类加载器去加载指定的java类。
如果String能够改变,可能加载指定类的请求会在中途被更改,变成加载其他类,造成安全性问题,比如:
加载“java.io.Writer” 的请求可能已被更改为加载 “mil.vogoon.DiskErasingWriter”。

5.线程安全

由于String的不可变性,所以在多线程编程中,可以安全的共享多个线程,避免了同步问题,不用额外的去外部同步String对象。

你可能感兴趣的:(为什么String在Java中是不可变的)