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一個數組去複製,而是在原數組基礎上進行擴展...再讓變量指向原數組...

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