1.String創建對象問題
1.1 字符串常量池
定義:jvm針對字符串存儲的一個特定內存區域。且里面內容都具有唯一性
1.2 創建對象單個說明
(1).String s = "abc";在創建這個對象時,會在常量池中看有沒有abc這個字符串;如果沒有 此時還會在常量池中創建一個;如果有 則不創建
(2).String s1 = "a" +"b"+"c";在字符串常量相加時,編譯器編譯時產生的字節碼,會把如 "a" +"b"+"c"優化為“abc”。所以只會產生一個對象
(3).String s = new String("abc");在創建這個對象時因為使用了new關鍵字,所以肯定會在堆中創建一個對象。然后會在常量池中看有沒有abc這個字符串;如果沒有 此時還會在常量池中創建一個;如果有 則不創建。所以一共會產生兩個對象
(4).String s = "abc";String s1= s + "ab";在變量與常量進行相加時,‘+’可以理解:為利用加號進行拼接字符串。執行過程如下
(1.在底層內部中會生成新的StringBuilder對象,調用SringBuilder中的append方法進行拼接。大概執行代碼如下:
new StringBuilder.append(s).append("ab");
(2.最后拼接完成之后會調用StringBuilder.toString()方法返回一個String的對象“abcab”。
new StringBuilder.append(s).append("ab").toString();
//StringBuilder.toString的JDK源碼
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
(3.所以第二個語句會產生3個對象
特殊情況
(5).String s = "c";String s1 = "a"+"b"+s+"d"+"f" ;在底層內部進行判斷時,在未出現變量之前的部分字符串還滿足(2)中的情況,所以會進行自動拼接變成“ab”,出現了變量之后就不符合(2)中的情況,所以后面的字符串不會進行拼接。所以最后變為了:“ab”+s+“d”+“f”; 所以第二個語句中會產生5個對象
1.3面試題
1.String s1 = "a" +"b"+"c"; //1個對象
2. String s2 = "a"; //1個對象
String s3= s2 +"bc"; //3個對象
3.String s4 = new String("你") + s2 + "b"; //5個對象
-----------------下面代碼與上面代碼沒有聯系-------------------------------
1.String s6 = "a";
2.String s7= "b" +"c" + s6; //3個對象
3.String s8= s6 + "d" +"f" ; //4個對象
4.String s9= "ab" + "cd" + s6 + "b" +"c" //5個對象
下面是這些編譯過后的代碼,來幫助理解
1.String s1 = "abc";
2.String s2 = "a";
String s3 = s2 + "bc";
3.String s4 = new String("你") + s2 + "b";
-----------------下面代碼與上面代碼沒有聯系-------------------------------
1.String s6 = "a";
2.String s7 = "bc" + s6;
3.String s8 = s6 + "b" + "c";
4.String s9= "abcd" + s6 + "b" +"c"