java常使用「==」和equals()方法來判斷物件是否相等,以下就來說下怎麼判斷兩個物件相等。
每個在堆上的對像都會有它的引用變量,如果沒有引用變量引用的對象,堆上的GC回來找它聊天的。
「==」的比較,符號兩邊都是物件的引用變量,如果比較回傳true的話,那就表示符號兩邊的引用變數引用的是同一個對象,因為「==」比較的是引用變數內的值,所以「==」比較就是引用比較。
但是如果是比較兩個不同物件在意義上是否相同的呢?例如兩個Student對象,對象的實例變數name,sex都一樣,我們能否認為它們是兩個相等的對象。
equals()方法
這就要用到equals()方法,首先我們要知道的是equals()方法是Object這個所有類別的父類別中就被定義了。在Object中equals的比較方式跟「==」類似,也是只有比較的兩個物件為同一個物件時才會回傳true,否則都會回傳false。所以我們在類別中就會重寫equals()方法來完成堆上兩個不同物件在意義上是否相同,在重寫equals()方法之前我們還要重寫hashcode()方法,因為我們再呼叫equals ()方法的時候,它會先將兩個物件的hashcode()返回的值進行比較,如果不相同就會返回false,我以我們在重寫hashcode()方法時會讓同類的所有物件都返回一個相同的hashcode值,透過在hashcode()方法中宣告一個result變數值,例如,
[code=”java”]public int hashCode() {
int result=17; =null?name.hashCode():0;
result=31*result+region!=null?region.hashCode():0;
;
return result;
}
接著回到equals()方法判斷兩個物件的實例變數是否相同,如果相同則是equals()方法傳回true,如果實例變數不同則會傳回false 寫equals()方法,需要看具體的類,因為每個類別的實例變數都不同,(新建一個物件的話如果沒有特殊的建構函數,實例變數會有預設值,所以新建的兩個不同類型也是相等的,因為實例變數都是預設值即相同)。