String創建了幾個對象?

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