String str1 = "a";
String str2 = "b";
str1 = str1 + str2;
syso(str1);
=>ab
1.栈中"str1"变量指向堆中的"a"对象;
2.栈中"str2"变量指向堆中的"b"对象;
3.执行str1 = str1 + str2;系统在堆中new出两一个数组来,将"a"和"b"复制进去,然后将栈中的"str1"执行这个new出来的数组;
4.所谓的不可变:他不是在原数组("a")上进行修改,而是新建了一个更大的数组进行扩展,也就是说,程序执行过后"a"这个数组在堆中还是存在的(未被回收之前),只不过此时栈中的"str1"不再指向他了;
5.这就是String和StringBuffered的区别,后者是在原数组上进行修改,改变了原数组的值,StringBuffered不是通过新new一个数组去复制,而是在原数组基础上进行扩展,再让变量指向原数组。
String的不可变,码迷,mamicode.com
时间: 2024-10-03 10:23:34