一、" == "
- 對於基本類型來說,比較的是值
- 對於引用類型來說,比較的是他們的引用
注:這裏值得引用是什麼呢,在創建引用類型的時候,會把引用存到棧中,而真正的值存儲在堆中,而引用存儲了值在堆中的地址
String x = "abc";
String y = "abc";
String z = new String("abc");
System.out.println(x == y); //true
System.out.println(x == z); //false
因爲常量“abc”是存儲在常量池的,指向的是同一個引用,所以x==y是true,而z是new的對象,他們的引用是不相同的,所以x == z是錯誤的
二、"equals"
在對象的equals中,本質上就還是==
但是,有特例,比如,String和Integer就重寫了equals方法,他們比較的是值
請看下面的例子:
Artist artist = new Artist("資訊");
Artist artist1 = new Artist("資訊");
System.out.println(artist.equals(artist1));//false
結果爲false,結果和我們預期是一樣的,其實在沒有重寫equals方法的時候,equals方法和==相同,比較的是引用,下面是Object中equals的源碼:
默認按照==比較
那請看下面這段代碼:
String s = new String("aaa");
String ss = new String("aaa");
System.out.println(s.equals(ss));//true
結果爲true,那爲什麼呢,因爲在設計String的時候,重寫了equals方法,請看源碼:
String最終比較的是值是否相同
總結一下:
"==" 對於基本類型來說是值比較,對於引用類型來說是比較的是引用;
而 equals 默認情況下是引用比較,只是很多類重寫了 equals 方法,比如 String、Integer 等把它變成了值比較