在談論equals和==的區別前,我們先簡單介紹一下JVM中記憶體配置的問題。
在JVM中 記憶體分為棧記憶體和堆記憶體。二者有什麼區別呢。
當我們建立一個對象(new Object)時,就會調用它的建構函式來開闢空間,將對象資料存放區到堆記憶體中,與此同時在棧記憶體中產生對應的引用,當我們在後續代碼中調用的時候用的都是棧記憶體中的引用,還需注意的一點,基礎資料型別 (Elementary Data Type)是儲存在棧記憶體中。有了一定的瞭解 我們來看Equals和==的區別。
首先equals和== 最大的區別是一個是方法一個是運算子,在Java中,二者比較的都是物理地址 而不是值得比較。
我們舉個例子這樣比較直觀。
Student student1 = new Student();
Student student2 = new Student();
System.out.println(student1.equals(student2));
System.out.println(student1 == student2);
不論是用的是哪一種方法 , 最終的結果顯示的都是false,大家不妨可以試一下。為什麼呢。就是因為他們比較的不是對象中欄位的值或者說本身對象的值,而比較的是物理地址。
我們再來舉一個例子。
String a = new String("a");
String b = new String("a");
System.out.println(a == b);
System.out.println(a.equals(b));
當我們建立2個String對象是 我們會發現 執行的結果是 false true。為什麼這次euqals返回的值編程了true。因為此時equals方法不單單是比較物理地址 同時也比較了值,
在String中 equals方法被重寫 當物理地址不同時,會進一步比較值,代碼如下:
if(object instanceof String){}
那麼問題來了 當我調用
System.out.println(student1.toString().equals(student2.toString()));時,結果又是怎樣的。
結果卻返回了false.為什麼呢。這就牽扯到了hashcode的問題。
那麼為了保證兩個對象比較值相等有什麼辦法麼。想必大家都試過重寫equals方法,而最終的結果都不如人意。為什麼。因為單單重寫equals方法並不能改變hashcode值,在java中 首先比較的就是hashcode。那麼如何結果這個問題。
大家可以嘗試 右鍵->source->generate hashcode() and equals() 來實現。
在下還是個菜鳥 第一次寫 , 也有許多不足,寫的不好的地方大家可以提,寫錯的地方大家可以糾正。