關於兩個字符串用加號鏈接

String s1="sss";
String s2="aaa";
String s3=s1+s2;
String s4="sss"+"aaa";app

問題一優化

System.out.println(s4=="sssaaa");//falsecode

問題二字符串

System.out.println(s3=="sssaaa");//true編譯器

有一個東西叫作常量摺疊,是一種編譯器優化技術。編譯

常量摺疊有什麼條件?
必須是編譯期常量之間進行運算纔會進行常量摺疊。
編譯期常量就是「編譯的時候就能夠肯定其值的常量」,並且這個認定比較嚴格。
首先:字面量是編譯期常量。(數字字面量,字符串字面量等)
其次:編譯期常量進行簡單運算的結果也是編譯期常量,如1+2,"a"+"b"。
最後:被編譯器常量賦值的 final 的基本類型和字符串變量也是編譯期常量。

對於問題(一)
 都是字符串字面量相加,都是編譯期常量,都會被編譯器進行常量摺疊。class

對於問題(二)
 s3倒是兩個非 final 的變量相加,因此不會進行常量摺疊。
而是根據 String 類特有的 + 運算符重載,變成相似這樣的代碼
String s3 = new StringBuffer(a).append(b).toString();

這裏toString()會生成新的String變量,顯然用 == 運算符比較是會返回 false。變量

相關文章
相關標籤/搜索