美文网首页
String为什么要设计不可变的?

String为什么要设计不可变的?

作者: 想做安徒生 | 来源:发表于2018-05-23 21:44 被阅读0次

    (1)不可变的原理

        1.用final修饰类 保证不会被任何类继承修改
    
        2.value[]  char数组也用final修饰保证一旦创建 value对象不能被修改指向另外的地址
    
        在后面所有String的方法里很小心的没有去动Array里的元素,没有暴露内部成员字段。private final char value[]这一句里,private的私有访问权限的作用都比final大。而且设计师还很小心地把整个String设成final禁止继承,避免被其他人继承后破坏
    
    image.png

    (2)不可变的原因和好处

    • 安全:多线程下对资源做写操作有危险。不可变对象不能被写,所以线程安全。

    • 可以共用一个实例(在多线程中共享一个不可变对象而不用担心线程安全问题):当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。String one = “someString”;String two = “someString”,都用字面量“someString赋值”,他们其实都指向同一个内存地址。当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。(PS:运行时常量池是方法区的一部分,用于存放各种字面量和符号引用)

    • String是几乎每个类都会使用的类,特别是作为Hashmap之类的集合的key值时候,mutable的String有非常大的风险。

    image.png

    Long, Double, Integer 之类的全都是final的 程序的基石是不可被改变的

    相关文章

      网友评论

          本文标题:String为什么要设计不可变的?

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