String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。本文总结下 String 类设计成不可变的原因及好处,以及 String 类是如何设计成不可变的。
String 类设计成不可变的原因及好处?
其实好处就是原因,String 设计成不可变,主要是从性能和安全两方面考虑。
1、常量池的需要
这个方面很好理解,Java 中的字符串常量池的存在就是为了性能优化。
字符串常量池(String pool)是 Java 堆内存中一个特殊的存储区域,当创建一个 String 对象时,假如此字符串已经存在于常量池中,则不会创建新的对象,而是直接引用已经存在的对象。这样做能够减少 JVM 的内存开销,提高效率。
String s1 = "abc";
String s2 = "abc";
如果字符串是可变的,那么常量池就没有存在的意义了。
2、hashcode 缓存的需要
因为字符串不可变,所以在它创建的时候 hashcode 就被缓存了,不需要重新计算。这就使得字符串很适合作为 HashMap 中的 key,效率大大提高。
3、多线程安全
多线程中,可变对象的值很可能被其他线程改变,造成不可预期的结果。而不可变的 String 可以自由在多个线程之间共享,不需要同步处理。