一、数据结构
String的数据结构是一个final修饰的数组,这个数组一旦被初始化,存入了字符串内容,就不能重新分配空间,这是String不可变的底层原因;
//相关源码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
private int hash; // Default to 0
private static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[0];
二、修改方法
String类中涉及修改字符串内容的方法,并没有直接去修改数组中的内容,而是将修改后的字符串内容通过一个新的数组存入到了一个新的String对象中。
示例代码:
public class Test {
public static void main(String[] args) {
String s1 = "你好";
System.out.println("修改前的字符:"+s1+";修改前字符的内存地址:"+System.identityHashCode(s1));
s1 = "你好呀";
System.out.println("修改后的字符:"+s1+";修改后字符的内存地址:"+System.identityHashCode(s1));
}
}
运行结果
修改前的字符:你好;修改前字符的内存地址:366712642
修改后的字符:你好呀;修改后字符的内存地址:1829164700