1.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"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM