一、簡(jiǎn)單類型比較
Java中,比較簡(jiǎn)單類型變量用“==”,只要兩個(gè)簡(jiǎn)單類型值相等即返回ture,否則返回false;
二、引用類型比較
引用類型比較比較變態(tài),可以用“==”,也可以用“equals()”來(lái)比較,equals()方法來(lái)自于Object類,每個(gè)自定義的類都可以重寫這個(gè)方法。Object類中的equals()方法僅僅通過“==”來(lái)比較兩個(gè)對(duì)象是否相等。
在用“==”比較引用類型時(shí),僅當(dāng)兩個(gè)應(yīng)用變量的對(duì)象指向同一個(gè)對(duì)象時(shí),才返回ture。言外之意就是要求兩個(gè)變量所指內(nèi)存地址相等的時(shí)候,才能返回true,每個(gè)對(duì)象都有自己的一塊內(nèi)存,因此必須指向同一個(gè)對(duì)象才返回ture。
在用“equals()”比較引用類型時(shí),情況就比較復(fù)雜,甚至有些變態(tài),容易掉進(jìn)陷阱。
在Java API中,有些類重寫了equals()方法,它們的比較規(guī)則是:當(dāng)且僅當(dāng)該equals方法參數(shù)不是 null,兩個(gè)變量的類型、內(nèi)容都相同,則比較結(jié)果為true。這些類包括:String、Double、Float、Long、Integer、Short、Byte、、Boolean、BigDecimal、BigInteger等等,太多太多了,但是常見的就這些了,具體可以查看API中類的equals()方法,就知道了。
解析變態(tài)的Boolean類:在這些類中,最最變態(tài)的是要數(shù)Boolean類了,我感覺是開發(fā)Boolean類的人員頭腦進(jìn)水了。我也不想細(xì)說(shuō)了,你有好四種方式來(lái)創(chuàng)建一個(gè)Boolean對(duì)象(兩構(gòu)造方法,兩個(gè)靜態(tài)方法valueOf(),推薦用靜態(tài)方法)。
Boolean類的變態(tài)之處不在于其equals()方法。而是在于Boolean對(duì)象創(chuàng)建方法。其實(shí)Boolean類的對(duì)象最多有兩個(gè),其toString()值分別是true和false。當(dāng)且僅當(dāng)用true或者"true"創(chuàng)建的Boolean類為同一個(gè)對(duì)象且toString()值為true。其他的字符串或者false創(chuàng)建的Boolean對(duì)象的值一律相等且toString()值為false。
三、重寫equals()方法
在定義一個(gè)類的時(shí)候,如果涉及到對(duì)象的比較,應(yīng)該重寫equals()方法。重寫的一般規(guī)則是:
1、先用“==”判斷是否相等。
2、判斷equals()方法的參數(shù)是否為null,如果為null,則返回false;因?yàn)楫?dāng)前對(duì)象不可能為null,如果為null,則不能調(diào)用其equals()方法,否則拋java.lang.NullPointerException異常。
3、當(dāng)參數(shù)不為null,則如果兩個(gè)對(duì)象的運(yùn)行時(shí)類(通過getClass()獲取)不相等,返回false,否則繼續(xù)判斷。
4、判斷類的成員是否對(duì)應(yīng)相等。往下就隨意發(fā)揮了。呵呵!
四、總結(jié)
“==”比較對(duì)象是否引用了同一個(gè)對(duì)象,或者比較簡(jiǎn)單類型變量值是否相等。
Object類的equals()方法用來(lái)比較是否一個(gè)對(duì)象(內(nèi)存地址比較),可以重寫。
JDK中有些類重寫了equals()方法,只要類型、內(nèi)容都相同,就認(rèn)為相等。
很變態(tài)的Boolean類,僅存在兩個(gè)實(shí)例。具體可查看API。
一般來(lái)說(shuō),一個(gè)類如果涉及到比較,應(yīng)該重寫equals()方法,因?yàn)閮?nèi)存地址比較沒有意義。
|
|