为什么String是不可变的?

字符串是一个常量,一旦创建了一个 String 对象,就无法改变它的值。

它的内容也就不可能发生变化(不考虑反射这种特殊行为)。

String 具备不变性背后的原因是什么:

1
2
3
4
5
6
public final class String
implements Java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
//...
}

private final 的 char 数组,数组名字叫 value。

它存储着字符串的每一位字符,同时 value 数组是被 final 修饰的,这个 value 一旦被赋值,引用就不能修改了。

除了构造函数之外,并没有任何其他方法会修改 value 数组里面的内容。

  • 而且 value 的权限是 private,外部的类也访问不到,所以最终使得 value 是不可变的。

String 类是被 final 修饰的,所以这个 String 类是不会被继承的。

因此没有任何人可以通过扩展或者覆盖行为来破坏 String 类的不变性。

String 不可变的好处

1、使用字符串常量池。

2、用作 HashMap 的 key。

3、缓存 HashCode。

4、线程安全