美文网首页
为什么String在Java中是不可变的

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

作者: 安在成丶 | 来源:发表于2019-08-16 10:43 被阅读0次
    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中是不可变的

          本文链接:https://www.haomeiwen.com/subject/lcohrctx.html