一、String字符串类型的数据结构
首先,String类是由 final 关键字修饰,这说明String 不可被继承。其次,由源代码可以看出String的成员字段value是一个char[ ]数组,在后面所有的String方法里都不提供修改Array数组的方法,没有暴露内部成员变量,而且是用 private final修饰的;private的私有访问权限都比final大,且整个String设计成final禁止继承,避免被其他人继承后破坏。
注:jdk1.8及以前String使用的是char数组,jdk1.9及以后使用的是byte数组!
图1 jdk1.8及以前char[ ]数组的String源代码
图2 jdk1.9及以后byte[ ]数组的String源代码
二、每次修改,都会产生一个新的字符串
String类的成员字段value是个char[ ]数组,且是final修饰的。final修饰的字段创建以后就不可以改变(指value这个引用地址不可以改变)。但是Array数组是可变的,String类型的所有改变内部存储结构的操作都会New出一个新的String对象(例:repace、subString、repalceAll等等)。
即,进行这些操作就是在堆内存中创建一个新的对象,然后value指向不同的对象,原字符串还是不可变!
图3 subString()方法返回新的对象