String 为什么设计成不可变的?
回答
- 这个问题,可以从下面几方面来讨论
1. 缓存
-
字符串是使用最广泛的数据结构。大量的字符串的创建是非常耗费资源的,所以,Java提供了对字符串的缓存功能,可以大大的节省堆空间。
-
JVM 专门开辟了一部分空间来存储 Java 字符串。就是字符串池。
-
例子
- 之所以可以实现缓存功能,主要是因为字符串的不变性。
2. 安全性
- 在程序中传递一个字符串的时候。
- 如果,这个字符串的内容是不可变的,那么,我们就可以相信这个字符串中的内容。
- 如果,是可变的,这个字符串内容可能随时都被修改。那么,这个字符串内容就完全不可信了。
3. 线程安全
-
不可变性自动使字符串成为线程安全的。
当从多个线程访问它们时,它们是不会被更改。
4. hashcode 缓存
-
不可变性保证了字符串的值不会改变。所以,
hashCode()方法计算的字符串的 hash 码也是不变的,这样就可以很方便的把 hash 缓存下来。 -
// String#hash 字段 /** Cache the hash code for the string */ private int hash; // Default to 0
5. 性能
- 字符串池缓存,字符串 hash 码缓存等,都是为了字符串操作更加高效。