java 字串比較(個人見解)
阿新 • • 發佈:2019-02-03
先看一道面試題
程式碼的執行結果是什麼?
public class Test { private static final String MESSAGE="taobao"; public static void main(String [] args) { String a ="tao"+"bao"; String b="tao"; String c="bao"; System.out.println(a==MESSAGE); System.out.println((b+c)==MESSAGE); } }
結果:
true
false
解析
1.字串的記憶體分配
private static final String MESSAGE=“taobao”;
*在編譯期間在常量池中分配一塊記憶體儲存taobao。
String a =“tao”+“bao”;
*在編譯期間,編譯器會優化語句,將該語句變為String a = “taobao”。也分配在常量池中,和MESSAGE是同一塊記憶體。
String b=“tao”;
String c=“bao”;
*在編譯期間,在常量池中分配兩塊記憶體分別存放tao,bao。
2.字串比較
使用==進行比較是比較兩個物件的例項是否為同一個,也可以理解為是否同一塊記憶體空間。
使用equals進行比較是比較兩個物件是否值相同。
System.out.println(a==MESSAGE);,這一句程式碼返回true,因為兩個都是同一塊記憶體。
System.out.println((b+c)==MESSAGE);,而這句程式碼返回false,因為在執行時,(b + c)使用語法糖,將新建一個stringBuilder來將兩個String相加後存放在堆記憶體中,在堆記憶體中的地址和常量池中的地址比較,肯定不相同。
結論
- 編譯器會優化String a =“tao”+“bao”;使得語句以String a ="taobao"來執行,都在編譯期間存放在常量池中。
- 兩個字串以(b + c)的形式相加時,是使用語法糖,相當於StringBuilder str = new StringBuilder(b + c);存放在堆記憶體中。