一、String字符串类型的数据结构
观察源代码,String类被final修饰,该类不能被继承。String字符串被存储在char类型的数组value,而value数组被声明为final,,且被private修饰,表示value数组被初始化后不能再改变(引用地址无法改变)。
final int[] value= {1,2,3};
int[] newvalue= {4,5,6};
value=newvalue;//编译器显示错误
但可修改value数组的内容:
final int[] value= {1,2,3};
value[0]=4;
System.out.println(Arrays.toString(value));
//[4,2,3]
二、每次修改,都会产生一个新的字符串
观察源代码,对数据进行修改时,会创建一个新的字符串。
public class demo01 {
public static void main(String[] args) {
//原字符串
String a="abc";
System.out.println("修改前"+a);//修改前abc
System.out.println("修改前内存地址"+a.hashCode());
//修改前内存地址96354
//修改字符串
a.replace("a","d");
System.out.println("观察是否修改"+a);//观察是否修改abc
System.out.println("实际修改后"+a.replace("a","d"));//实际修改后dbc
System.out.println("实际修改后的内存地址"+a.replace("a","d").hashCode());
//真正修改后的内存地址99237
}
}
修改字符串的某个字符,不会在原有的字符串上进行修改(字符串的不可变性),而是会分配一个新的内存地址给他,产生一个新的字符串。