String为什么设计成不可变

1.1 什么是不可变?

 对象一旦创建后,其状态不可修改,则成为不可变对象。一般对象满足以下三点,则可以成为是不可变对象:

  * 其状态不能在创建后修改。

  * 所有域都是final类型。

  * 其构造函数构造对象期间,this引用没有泄露。

 

1.2 什么 String 类要被设计成不可变的呢?

    1)常量池的需要

      字符串常量池是 Java 堆内存中一个特殊的存储区域,当创建一个 String 对象时,假如此字符串在常量池中不存在,那么就创建一个;假如已经存在,就不会再创建了,而是直接引用已经存在的对象。这样做能够减少 JVM 的内存开销,提高效率。

    2)hashCode 的需要

      因为字符串是不可变的,所以在它创建的时候,其 hashCode 就被缓存了,因此非常适合作为哈希值(比如说作为 HashMap 的键),多次调用只返回同一个值,来提高效率。

    3)线程安全

      就像之前说的那样,如果对象的状态是可变的,那么在多线程环境下,就很容易造成不可预期的结果。而 String 是不可变的,就可以在多个线程之间共享,不需要同步处理。

 

  

posted @ 2021-01-06 15:15  year12  阅读(343)  评论(0编辑  收藏  举报