String为什么设计成不可变
1.1 什么是不可变?
对象一旦创建后,其状态不可修改,则成为不可变对象。一般对象满足以下三点,则可以成为是不可变对象:
* 其状态不能在创建后修改。
* 所有域都是final类型。
* 其构造函数构造对象期间,this引用没有泄露。
1.2 什么 String 类要被设计成不可变的呢?
1)常量池的需要
字符串常量池是 Java 堆内存中一个特殊的存储区域,当创建一个 String 对象时,假如此字符串在常量池中不存在,那么就创建一个;假如已经存在,就不会再创建了,而是直接引用已经存在的对象。这样做能够减少 JVM 的内存开销,提高效率。
2)hashCode 的需要
因为字符串是不可变的,所以在它创建的时候,其 hashCode 就被缓存了,因此非常适合作为哈希值(比如说作为 HashMap 的键),多次调用只返回同一个值,来提高效率。
3)线程安全
就像之前说的那样,如果对象的状态是可变的,那么在多线程环境下,就很容易造成不可预期的结果。而 String 是不可变的,就可以在多个线程之间共享,不需要同步处理。
Nice to see you all!