對於java 的 == 和equals()方法,在網上看到這樣一段描述:java
值類型是存儲在內存中的堆棧(之後簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其自己則存儲在堆中。this
==操做比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。spa
equals操做表示的兩個變量是不是對同一個對象的引用,即堆中的內容是否相同。code
==比較的是2個對象的地址,而equals比較的是2個對象的內容。對象
顯然,當equals爲true時,==不必定爲true;繼承
注意加粗的那兩句話,實際上是有問題的,爲何?下面咱們來看看。內存
對於equals方法來講,在Object類裏是這樣的:字符串
public boolean equals(Object obj) { return (this == obj); }
能夠看到這裏 equals和==是等價的!!class
那麼爲何會出現== 和equals獲得不一樣結果的現象呢?還記得java面向對象的特性嗎?多態,怎樣實現多態?要有繼承,要有重寫。沒錯,就是重寫!對於equals方法能獲得什麼結果,要看子類裏equals方法的具體實現是什麼。好比,在String類裏是這樣的:變量
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
首先看==是否爲真,若是爲真則表示是指向的同一個堆地址,所以確定是一個對象,認爲相等,返回 true。
若是不是一個對象,則再判斷要比較的對象是不是String類型,若是根本不是String類型,則直接認爲不等,返回false,若是是String類型,再逐個判斷字符串內的字符是否一致,注意這裏比較的是基本類型char的值,也就是判斷String的內容是否一致。
總結:對於對象的equals方法返回值,要看對象類對該方法的具體實現,若是沒有重寫該方法,則和==的返回結果一致!