對象間的比較
- 對象間如何進行比較
- 相等 equals
-
- 職責
- 定義
- 重寫equals
- 不等 compaerTo/compare
-
- compareTo
-
- 實作
- compare
對象間如何進行比較
在Java中,我們隻能通過引用去通路對象,但是引用沒辦法使用">’’ ,"<" 進行比較。
即使通過“ = =”和“!=”比較,也不是進行對象間的比較,而是判斷是否指向同一對象。
相等 equals
對象間如何進行 相等 OR 不等的比較呢,我們可以使用 equals方法。
在Object類中,提供了equals方法。傳回 true:對象相等。傳回:false,對象不等。
職責
作為類的定義者,我們有責任重寫Object類下的equals方法,定義對象相等,隻有定義類,才知道類->對象中有那些屬性。
作為類的使用者,有責任,當比較對象是否相等的時候,必須使用equals方法,不能簡單使用“==”和“!=”比較。
定義
如果在類的定義時候,沒有重寫過equals方法,那麼會調用Object中的預設的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
預設實作,比較兩個引用是否指向同一個對象
當類的定義的時候,重寫過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;
}
它的作用是先判斷兩個引用是否指向同一個對象,然後判斷對象類型是否為String,然後判斷對象長度,最後每個字元的比較。
重寫equals
當重寫equals時候,一般使用IDEA幫助我們重寫,它有自己一套生成模闆。
例如:
不等 compaerTo/compare
關于對象直接進行“>”,“<”,“=”的比較:
compareTo
實作
作為類的定義者,可以直接聲明該類具有支援該功能(具備比較的能力)
實作一個Comparable的接口
public class XXX implements Comparable{
}
在這個接口下有一個抽象方法:
我們需要重寫這個compareTo方法。
this和o比較,this < o 傳回負數
this > o傳回正數
this = o傳回0;
作為類的調用者,如果一個類中實作了Comparable接口,則我們可以嗲用compareTo方法比較,并根據傳回值的大小決定大小關系。
compare
當我們還是想比較兩個對象,但是我們并不想按照指定的預設規則比較。
在Java中提供了一種機制,解決該問題,我們可以定義一個類,則該類實作Comparator接口。
public class XXX implements Comparator{
}
Comparator可以了解為構造器,其中有構造方法:
傳入兩個對象,交給你比較,根據自己實際需求重寫,完成比較。