public static void main(String[] args) {
String a="123";
String b = a;
a = "456";
System.out.println(a);
System.out.println(b);
Map<String,Object> amap=new HashMap<>();
amap.put("a1","1");
Map<String,Object> bmap=amap;
amap.put("a1","2");
System.out.println(amap);
System.out.println(bmap);
}
结果:
456
123
{a1=2}
{a1=2}
本质上string 是引用类型的。
string a=“xxx”;
a指向字符串xxx所在的地址。
string b=a;
会把a的地址给b,此时a和b保存相同的地址(hashcode相同),所以他们的值是相同的。
a=“yyy”;
此时并不是把a地址的内容改为yyy,而是重新分配地址保存字符串"yyy".修改a的地址为指向yyy.
于是,a有个新地址指向yyy,b仍是老地址指向xxx.
b=“zzz”;
此时并不是把b地址的内容改为zzz,而是重新分配地址保存字符串"zzz".修改b的地址为指向zzz.
于是,不再有变量指向xxx,xxx内存会被回收。
但像map,list,Object这种复杂对象结构地址相同,改变一个变量另一个变量的值也会随之改变。
这时候想另一个对象的值不随之改变则需要进行深拷贝操作,再造出一个改变值之前的镜像进行赋值。