内容存储形式
JDK1.8:字符数组 private final char[] value;
JDK1.9:字节数组 private final byte[] value;
不可变性
定义
- 字符串对象一旦创建,对象内部的字符内容就不能被修改。所有对字符串的修改操作,都会生成新的 String 对象,原对象保持不变。
实现原理
- String 类被
final修饰:避免子类重写方法篡改字符串内容;保证所有使用 String 的地方行为统一。如果可以继承,子类可以覆写方法对外返回修改后的字符,破坏不可变语义。 - 存储字符的
value[]被private修饰:禁止外部直接拿到字符数组引用。如果不是 private,外部拿到数组引用后,可以通过value[0]='X'修改数组元素。 - 存储字符的
value[]被final修饰:保证 value 引用不能指向另一个新数组。阻止类似代码:this.value = new char[0]; - 没有对外提供修改
value[]的 API:不提供能够修改 value 数组的方法。