Java 中 Equals和==的區別__java

來源:互聯網
上載者:User

在談論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() 來實現。


在下還是個菜鳥  第一次寫 , 也有許多不足,寫的不好的地方大家可以提,寫錯的地方大家可以糾正。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.