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