java中經(jīng)常遇到判斷對象是否一致的場景次企,這里記錄一下常用的三個(gè)關(guān)鍵字(或運(yùn)算符)的區(qū)別馆蠕。
instanceof:
多見于多態(tài)或繼承關(guān)系中類型轉(zhuǎn)換(即強(qiáng)制類型轉(zhuǎn)換與自動轉(zhuǎn)換)時(shí)判斷類型是否一致彬呻,A instanceof B是用來判斷內(nèi)存中實(shí)際對象A是不是B類型。
用偽代碼來表現(xiàn)Java語言規(guī)范所描述的運(yùn)行時(shí)語義如下:
// obj instanceof Tbooleanresult;
if(obj==null){
result =false;
}else{
try{
T temp = (T)obj;// checkcast
result =true;
}catch(ClassCastExceptione){
result=false;
}
}
本處引用费薄,更詳細(xì)請參見知乎大神回答坷檩。
==:
判斷當(dāng)前對象引用內(nèi)存地址是否一致,即是否是其本身赡艰。
equals:
Object類中的equals用于檢測一個(gè)對象是否等于另外一個(gè)對象售淡,即是否跟比較對象一致,但不必是其本身慷垮。大多應(yīng)用場景(例如子類判斷)需要我們自己去實(shí)現(xiàn)equals方法揖闸,用來做自定義的判斷。
有一個(gè)比較簡單形象的例子用于區(qū)別==與equals:
if(真美猴王==假美猴王){
returnflase;
}
if(真美猴王.equals(假美猴王)){
returntrue;
}