黑馬程序員 “+”運算符,產生新對象問題

---------------------- android培訓java培訓、期待與您交流! ----------------------

public static void main(String[] args) 
	{
		String a = "xy";  
		String b = "x" + "y";//這裏會被編譯器自動優化成b = "xy";  
     		String aa = "x";  
		String bb = "y";  
     		String c = aa+bb;  
  		String d = aa+"y";   //由於和字面量"y"進行+運算的是一個對象而不是字面量,  
		String e = "x"+bb;   //這樣Java虛擬機就會在堆裏面生成一個新的對象並返回該對象引用
     						//雖然a,b,c,d,e的內容都是xy
		System.out.println(a == b);//但是隻有第一個是true  
		System.out.println(a == c);  //false
		System.out.println(a == d);   //false
		System.out.println(a == e);   //false
     		 System.out.println(d == e);  //false
	}


這個問題我想了很久也找了很久,終於找到一個好的解釋了:
      首先要搞清楚的是字符串用==比較表示兩個字符串是不是指向同一個對象,即是否指向同一個地址。
      程序在運行的時候會創建一個字符串緩衝池,程序會把字符串常量(如程序中的"a","b","ab","a"+"b")放入字符串緩衝池中(這裏"ab","a"+"b"是一個對象)。當使用 
String s1 = "a";
String s2 = "b";
String s3 = "ab";
String s4 = s1 + s2;
String s5 = "a" + "b";
String s6 = s1 + "b";
這樣的表達是創建字符串的時候,程序首先會在這個String緩衝池中尋找相同值的對象,s3先被放到了池中,所以在s5被創建的時候,程序找到了具有相同值的 s3,將s5引用s3所引用的對象"ab"。所以比較s5==s3由於兩個是指向同一個對象,所以爲true。
       
但是在這些賦值中,涉及到變量運算,所以得到的字符串對象存儲在各自的內存中,不是緩衝池中的s3對象,如
                String s4 = s1 + s2;
String s6 = s1 + "b";
       所以 儘管s4,s6的值均爲"ab",但是 s4==s3和s6==s3返回的結果均爲false;。同時s4,s6也不是指向相同的對象,因爲他們在不同內存中。
         如果相比較兩個字符串的值是不是相等,最好用.equals()方法。



--------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------
發佈了45 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章