==
和equals
的區(qū)別
- 值類型(
int,char,long,boolean
等)都是用==判斷相等性。對(duì)象引用的話,==判斷引用所指的對(duì)象是否是同一個(gè)。 - equals是Object的成員函數(shù),有些類會(huì)覆蓋(
override
)這個(gè)方法,用于判斷對(duì)象的等價(jià)性。
例如String
類,兩個(gè)引用所指向的String
都是”abc
“,但可能出現(xiàn)他們實(shí)際對(duì)應(yīng)的對(duì)象并不是同一個(gè)(和jvm實(shí)現(xiàn)方式有關(guān)),因此用==
判斷他們可能不相等,但用equals
判斷一定是相等的??傮w來(lái)說(shuō)要搞清楚,還是需要先理解清楚對(duì)象實(shí)體和引用之間的關(guān)系。
instanceof
instanceof
是Java、php的一個(gè)二元操作符(運(yùn)算符),和==,>,<是同一類東西。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是判斷其左邊對(duì)象是否為其右邊類的實(shí)例,返回boolean
類型的數(shù)據(jù)??梢杂脕?lái)判斷繼承中的子類的實(shí)例是否為父類的實(shí)現(xiàn)。相當(dāng)于c#中的is操作符。java中的instanceof
運(yùn)算符是用來(lái)在運(yùn)行時(shí)指出對(duì)象是否是特定類的一個(gè)實(shí)例。instanceof
通過(guò)返回一個(gè)布爾值來(lái)指出,這個(gè)對(duì)象是否是這個(gè)特定類或者是它的子類的一個(gè)實(shí)例。
相等測(cè)試與繼承
如果隱式和顯式參數(shù)不屬于同一個(gè)類,equals方法將如何處理呢?
public class Employee {
private String name;
private String hireDay;
private int salary;
public boolean equals(Object otherObject) {
//首先簡(jiǎn)單的測(cè)試一下對(duì)象是否相等
if(this ==otherObject) return true;
//判空
//如果這里不進(jìn)行判空,會(huì)出現(xiàn)什么后果
if(otherObject ==null) return false;
//如果對(duì)象所屬類不匹配,則他們不相等
if(getClass() != otherObject.getClass()) return false;
Employee other = (Employee) otherObject;
//判斷對(duì)象里面的內(nèi)容是否相等
//若果在構(gòu)造對(duì)象時(shí),沒(méi)有對(duì)里面一個(gè)或者多個(gè)內(nèi)容進(jìn)行賦值,即有些內(nèi)容為null,這里或出現(xiàn)什么后果?
return name.equals(other.name)
&&salary == other.salary
&&hireDay.equals(other.hireDay);
}
}
java語(yǔ)言的規(guī)范要求equals方法具有下面的特性
- 對(duì)稱性: 對(duì)于任何引用x和y,當(dāng)且僅當(dāng)
x.equals(y)
返回是“true
”,那么y.equals(x)
也應(yīng)該返回是“true
” ;
這里有一個(gè)問(wèn)題:首先假設(shè)一個(gè)類的對(duì)象為y,其子類的對(duì)象為x,加入在equals
中使用instanceof
進(jìn)行比較 y.equals(x)
;中會(huì)返回true
;
然而:x.equals(y)
會(huì)返回false
這不符合equals的對(duì)稱性?。?!
建議:
如果子類能夠擁有自己的相等概念,則對(duì)稱性需求將強(qiáng)制采取getClass
進(jìn)行檢測(cè)
如果由超類決定相等的概念,那么就可以使用instanceof
進(jìn)行檢測(cè),這樣可以在不同的子類的對(duì)象之間進(jìn)行相等的比較。
自反性: 對(duì)于任何非空引用x,
x.equals(x)
應(yīng)該返回“true
” ;傳遞性: 對(duì)于任何引用x和y,如果x.equals(y)返回是“
true
”,y.equals(z)
返回是“true
”,那么z.equals(x)
也應(yīng)該返回是“true
” ;一致性: 如果x和y引用的對(duì)象沒(méi)有發(fā)生變化,反復(fù)調(diào)用
x.equals(y)
應(yīng)該返回同樣的結(jié)果對(duì)于任意非空引用x,
x.equals(null)
應(yīng)該返回false
。