執行如下的java代碼
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println(b == d);
System.out.println((a == c));
System.out.println((a == e));
執行結果
true
true
false
原因
加了final修飾後,在編譯時,java會把b當成常量來處理,實際編譯就會變成
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = "hello" + 2;
String e = d + 2;
......
所以a創建後會放入常量池裏,c則是兩個常量拼接,直接從常量池裏找,所以a和c指向同一個地址;而e執行的是變量和常量相加,實際會產生一個stringBuilder對象,會另外分配一塊內存,因此e和a的地址不同,比較結果爲false