1、“==”
“==”運(yùn)算符用來比較兩個(gè)變量的值是否相等。具體情況如下:
(1)如果兩個(gè)變量是基本數(shù)據(jù)類型,可以直接使用“==”運(yùn)算符來比較其對(duì)應(yīng)的值是否相等。
(2)如果一個(gè)變量指向的數(shù)據(jù)是對(duì)象(引用類型),此時(shí)就會(huì)涉及到兩塊內(nèi)存,對(duì)象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,變量所對(duì)應(yīng)內(nèi)存存儲(chǔ)的數(shù)值就是對(duì)象占用的那塊內(nèi)存的首地址。如果要比較兩個(gè)變量是否指向同一個(gè)對(duì)象,就可以用“==”來判斷。但是如果要比較兩個(gè)變量所指向?qū)ο蟮膬?nèi)容是否相等,“==”就無能為力了。
2、equals()
equals()是Object類提供的方法之一。每一個(gè)Java類都繼承Object類,所以每個(gè)對(duì)象都具有equals()方法。Object類中定義的equals(Object)方法是直接使用“==”運(yùn)算符比較兩個(gè)對(duì)象,所以在沒有覆蓋equals(Object)方法的情況下,equals(Object)與“==”運(yùn)算符一樣,比較的是引用。
相比“==”,equals(Object)方法的特殊之處就在于它可以被覆蓋,所以可以通過覆蓋的方法讓它比較數(shù)據(jù)內(nèi)容而不是比較引用。
3、hashCode()
hashCode()方法是從Object類中繼承過來的,它也用來鑒定兩個(gè)對(duì)象是否相等。Object類中的hashCode()方法返回對(duì)象在內(nèi)存中地址轉(zhuǎn)換成的一個(gè)int值,所以如果沒有重寫hashCode()方法,任何對(duì)象的hashCode()方法返回值都是不相等的。
一般在覆蓋equals()方法的同時(shí)也要覆蓋hashCode()方法,否則,就會(huì)違反Object.hashCode的通用約定,從而導(dǎo)致該類無法與所有基于散列值(hash)的集合類(HashMap、HashSet和Hashtable)結(jié)合在一起正常運(yùn)行。
hashCode()方法返回值和equals()方法的關(guān)系如下:
(1)如果x.equals(y)返回true,即兩個(gè)對(duì)象根據(jù)euqals()方法比較是相等的,那么x和y兩個(gè)對(duì)象的hashCode()返回值也是相等的。
(2)x.equals(y)返回false,那么x和y兩個(gè)對(duì)象的hashCode()返回值可能是相等的,也可能不相等。
(3)如果x和y兩個(gè)對(duì)象的hashCode()返回值不相等,一定能推出x.equals(y)返回false。
(4)如果x和y兩個(gè)對(duì)象的hashCode()返回值相等,x.equals(y)可能返回false,也可能返回true。