首先什么是不可变——任何对于 String 对象的操作都是重新指向一个新的对象(新的地址),不是在原内存地址上修改数据。
我们观察String源代码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
在这里也了解一下final关键字
final:最终
1.声明变量:基本数据类型的常量不允许修改值,引用类型允许修改值不允许分配新地址。
2.修饰方法:final修饰的方法代表最终方法,在当前类允许重载,子类不允许修改、不能重写
3.声明类(最终类):不允许子类继承
可以看到 String 类是用关键字 final 修饰的,所以String 类不可被继承。
成员变量 value 是用关键字 final 修饰的,保证了 value 的引用地址不可变,但是里面的元素可以被修改。所以每次对String对象修改,都会产生一个新的字符串。
总结
String不可变的两点原因:1.String类加了final,所以不能被继承
2.数组加了final,每次改变字符串其实是新建一个字符(substring)