四个
b
c
new出来的一个
a指向
1.String a=new String("b"+"c");
b一个 c一个 b+c一个 a一个 总共四个
1、Java中New出的对象则始终被JVM存放在堆中,创建的字串常量则始终被JVM存放在数据段区常量池中。
2、String是不可变的
String a=new String("b"+"c");
字符串常量 "b" 被JVM存放在数据段区常量池中
字符串常量 "c" 被JVM存放在数据段区常量池中
由于String不可变性,"b"+"c" 又生成了一个字符串 被JVM存放在数据段区常量池中
new String("b"+"c")对象被JVM存放在堆中
总共四个。
string的不可变性
String a = new String("Hello");
String b = new String("world");
String c = a + b;//c = Helloworld
首先在栈中有个"a"变量指向堆中的"Hello"对象...栈中"b"变量指向堆中的"world"对象
当执行到c = a + b;
系统重新在堆中new一个更大的数组出来,然后将"Hello"和"world"都复制进去,然后栈中的"c"指向这个新new出来的数组...
所谓的不可变是指:它没有在原数组“Hello”上进行修改,而是新建了个更大数组进行扩展,也就是说,这时候堆里还是有“Hello”这个对象数组存在的,只不过这个时候"s"变量不在指向"Hello"这个数组了,而是指向了新new出来的数组,这就是和StringBuffered的区别,后者是在原数组上进行修改,改变了原数组的值,StringBuffered不是通过新new一个数组去复制,而是在原数组基础上进行扩展...再让变量指向原数组....