區別: “==” 比較的是兩個引用在記憶體中指向的是不是同一對象(即同一記憶體空間),也就是說在記憶體空間中的存儲位置是否一致。 如果兩個對象的引用相同時(指向同一對象時),“==”操作符返回true,否則返回flase。 註:如果有對記憶體分配及變數存儲位置(堆、棧、方法區常量池、方法區靜態區)感興趣的可 ...
區別:
“==” 比較的是兩個引用在記憶體中指向的是不是同一對象(即同一記憶體空間),也就是說在記憶體空間中的存儲位置是否一致。
如果兩個對象的引用相同時(指向同一對象時),“==”操作符返回true,否則返回flase。
註:如果有對記憶體分配及變數存儲位置(堆、棧、方法區常量池、方法區靜態區)感興趣的可以去看看這篇博客,裡面寫的很詳細。對我還在學基礎的人來說幫助很大,理解了很多內容,還有待消化。
equals方法是由Object對象提供的,可以由子類來進行重寫
Object類預設的實現如下:
1 public boolean equals(Object obj) {
2
3 return (this == obj);
4
5 }
預設的實現只有當對象和自身進行比較時才會返回true, 這個時候和 “==”是等價的。
Java中很多類(String類 Date類 File類)等都對equals方法進行了重寫,這裡拿常見的String類舉例。
1 public class Test {
2 public static void main(String[] args) {
3 String str1 = "abc";
4 String str2 = "abc";
5 System.out.println(str1==str2);//true
6
7
8 String str3 = new String("abc");
9 String str4 = new String ("abc");
10 System.out.println(str3==str4);//false
11 System.out.println(str3.equals(str4));//true
12 }
13 }
上例中第5行,我們看到str1 == str2 的結果是true
分析原因:
先看第3行代碼,先在棧中創建一個對 String類的對象引用變數str1,然後通過引用去字元串常量池 里找有沒有"abc",如果沒有,則將"abc"存放進字元串常量池。這裡常量池中並沒有“abc”。即在編譯期已經創建好(直接用雙引號定義的)“abc”,存儲在了常量池中。(如果有對常量池不理解的可以看看我上面推薦的博客)
第4行代碼又創建了對String類的對象引用str2,然後通過引用去字元串常量池 里找有沒有"abc",如果沒有,則將"abc"存放進字元串常量池 ,並令str2指向”abc”,如果已經有”abc” 則直接令str2指向“abc”。這裡我們在第三行代碼中已經將“abc”這個字元串存儲進了常量池。所以把str2和str1指向的是同一個“abc”,返回true。
第8行和第9行代碼分別創建了2個對象,str3和str4指向的是不同的對象,即上面所說的記憶體空間中存儲位置不同。故str3 == str4 返回的肯定是false。
第11行代碼 str3.equals(str4) 返回true
因為String類重寫了equals方法,比較的是記憶體空間存放的數據是否相同。這裡存放的都是字元串“abc” 故返回true。
總結:
Java 語言里的 equals方法其實是交給開發者去覆寫的,讓開發者自己去定義滿足什麼條件的兩個Object是equal的。
所以我們不能單純的說equals到底比較的是什麼。你想知道一個類的equals方法是什麼意思就是要去看定義。(以上是來自知乎用戶的回答)
我們要理解的是equals存在的目的。
如果要看更詳細的介紹可以去看這篇博客http://www.cnblogs.com/bluestorm/archive/2012/03/02/2377615.html
我的第一篇博客就到此結束了,身為java初學者,為了總結所學知識以上寫的內容還很粗淺,如有不足和錯誤歡迎指正。