1.==
1.“==”用來判斷基本數(shù)據(jù)類型(byte,short,char,int,long,float,double,boolean)的時(shí)候,判斷的是它們的值是否相同鼓择,例如
2."=="用來判斷引用類型(類摆出、接口朗徊、數(shù)組)的時(shí)候,判斷的是內(nèi)存中的存放地址是否相同(是否引用同一個(gè)對象),例如
自定義變量str1象踊、str2會(huì)首先去java內(nèi)存尋找字段“aaa”,如果存在字段“aaa”則引用該地址逆害,如果沒有則創(chuàng)建新的空間存儲(chǔ)字段坛芽,所以str1 == str2返回true翼抠。
new一個(gè)新的對象str3咙轩、str4活喊,不論java內(nèi)存中有沒有字段“aaa”量愧,都會(huì)創(chuàng)建新的空間存儲(chǔ)字段钾菊,所以str1 == str3、str3 == str4返回true偎肃。
2.equals
1.調(diào)用Object類的equals方法的時(shí)候煞烫,比較的是內(nèi)存中的存放地址是否相同(是否引用同一個(gè)對象),此時(shí)的equals作用和“==”是相同的
2.JDK中累颂,String红竭、Long等封裝類都對equals()方法進(jìn)行了重寫,所以在使用的時(shí)候需要根據(jù)代碼來確定equals()的作用。重寫后的equals()方法一般都是用來判斷兩個(gè)對象的內(nèi)容是否相同
當(dāng)我們需要對equals()方法進(jìn)行重寫茵宪,判斷兩個(gè)實(shí)例對象的內(nèi)容是否相同的時(shí)候,對于equals重寫需要注意五點(diǎn):
1. 自反性:對任意引用值x瘦棋,x.equals(x)的返回值一定為true.
2.對稱性:對于任何引用值x,y,當(dāng)且僅當(dāng)y.equals(x)返回值為true時(shí)稀火,x.equals(y)的返回值一定為true;
3.傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4 .一致性:如果參與比較的對象沒任何改變,則對象比較的結(jié)果也不應(yīng)該有任何改變
5.非空性:任何非空的引用值X赌朋,x.equals(null)的返回值一定為false
3.hashcode
hashCode()方法返回一個(gè)數(shù)值凰狞,該數(shù)值是根據(jù)哈希算法將該對象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)返回也叫做哈希碼。
1.hash碼的作用
主要作用是配合基于散列的集合(HashSet沛慢、HashMap以及HashTable)一起正常運(yùn)行赡若,來提高運(yùn)行效率。例如:
向HashTable中插入-條數(shù)據(jù)团甲,使用equals逐條進(jìn)行比較可行逾冬,但如果數(shù)據(jù)量過大會(huì)大大減低效率。hashcode很好的解決了這個(gè)問題躺苦,首先會(huì)調(diào)用hashCode方法得到對應(yīng)的hashcode值身腻,然后查找是否有該hashcode值,如果沒有該hashcode值匹厘,它就可以直接存進(jìn)去嘀趟,不用再進(jìn)行任何比較了;如果存在該hashcode值愈诚,就調(diào)用它的equals方法進(jìn)行比較她按,相同的話就不存入該數(shù)據(jù),不相同就存入該數(shù)據(jù)炕柔,HashTable中put方法:
注:由于不同對象可能會(huì)產(chǎn)生相同的hashcode值酌泰,所以不能通過hashcode直接判斷兩個(gè)對象是否相同,但是可以直接根據(jù)hashcode值判斷兩個(gè)對象不等汗唱,如果兩個(gè)對象的hashcode值不等宫莱,則必定是兩個(gè)不同的對象。如果要判斷兩個(gè)對象是否真正相等哩罪,必須通過equals方法授霸。
2.equals()和hashcode()關(guān)系
1).重寫equals()方法的時(shí)候,需要重寫hashcode()方法际插;
2).若兩個(gè)對象equals相同碘耳,則hashCode一定相同;
3).若兩個(gè)對象equals不相同框弛,hashCode不一定不相同辛辨;
4).若兩個(gè)對象hashCode相同,equals不一定相同;
5).若兩個(gè)對象hashCode不相同斗搞,equals一定不相同指攒;