Java中==與equals的區別及理解

區別:html

「==」 比較的是兩個引用在內存中指向的是否是同一對象(即同一內存空間),也就是說在內存空間中的存儲位置是否一致。(引用類型)post

若是兩個對象的引用相同時(指向同一對象時),「==」操做符返回true,不然返回flase。this

注:若是有對內存分配及變量存儲位置(堆、棧、方法區常量池、方法區靜態區)感興趣的能夠去看看這篇博客,裏面寫的很詳細。對我還在學基礎的人來講幫助很大,理解了不少內容,還有待消化。url

 

equals方法是由Object類提供的,能夠由子類來進行重寫spa

Object類默認的實現以下:code

1 public boolean equals(Object obj) {
2 
3     return (this == obj);
4 
5 }

默認的實現只有當對象和自身進行比較時纔會返回true, 這個時候和 「==」是等價的。htm

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 的結果是trueblog

分析緣由:內存

先看第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存在的目的。

相關文章
相關標籤/搜索