String a=new String("b","c")会创建几个对象?

String a=new String("b","c")会创建几个对象? 
String a=new String("b"+"c")又会创建几个?为什么?

 

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一个数组去复制,而是在原数组基础上进行扩展...再让变量指向原数组...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章