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对象。
网友评论