1. 程式人生 > >java 字串比較(個人見解)

java 字串比較(個人見解)

先看一道面試題

程式碼的執行結果是什麼?

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);存放在堆記憶體中。