hashcode && equals && ==

HashSet要求不能存儲相同的對象,HashMap要求不能存儲相同的鍵。

JDK對equals(Object obj)和hashcode()這兩個方法的定義和規(guī)范: 在Java中任何一個對象都具備equals(Object obj)和hashcode()這兩個方法,因為他們是在Object類中定義的。equals(Object obj)方法用來判斷兩個對象是否“相同”,如果“相同”則返回true,否則返回false。 hashcode()方法返回一個int數(shù),在Object類中的默認實現(xiàn)是“將該對象的內(nèi)部地址轉(zhuǎn)換成一個整數(shù)返回”。

兩個最重要的重要規(guī)范(不止兩個):?

規(guī)范1:若重寫equals(Object obj)方法,有必要重寫hashcode()方法,確保通過equals(Object obj)方法判斷結(jié)果為true的兩個對象具備相等的hashcode()返回值。說得簡單點就是:“如果兩個對象相同,那么他們的hashcode應(yīng)該相等”。不過請注意:這個只是規(guī)范,如果你非要寫一個類讓equals(Object obj)返回true而hashcode()返回兩個不相等的值,編譯和運行都是不會報錯的。不過這樣違反了Java規(guī)范,程序也就埋下了BUG。

規(guī)范2:如果equals(Object obj)返回false,即兩個對象“不相同”,并不要求對這兩個對象調(diào)用hashcode()方法得到兩個不相同的數(shù)。說的簡單點就是:“如果兩個對象不相同,他們的hashcode可能相同”。

根據(jù)這兩個規(guī)范,可以得到如下推論: (充分不必要)

1)、如果兩個對象equals,Java運行時環(huán)境會認為他們的hashcode一定相等。

2)、如果兩個對象不equals,他們的hashcode有可能相等。

3)、如果兩個對象hashcode相等,他們不一定equals。

4)、如果兩個對象hashcode不相等,他們一定不equals。?

java運行時環(huán)境是怎樣判斷HashSet和HastMap中的兩個對象相同或不同了:先判斷hashcode是否相等,再判斷是否equals。?

參考:https://www.cnblogs.com/xiohao/p/4199446.html


Object類定義中對hashCode和equals要求如下:

1)如果兩個對象的equals的結(jié)果是相等的,則兩個對象的hashCode的返回結(jié)果也必須是相同的。

2)任何時候覆寫equals,都必須同時覆寫hashCode。

參考《碼出高效》P177


1.equals和==

1)==用于比較引用和比較基本數(shù)據(jù)類型時具有不同的功能:

比較基本數(shù)據(jù)類型,如果兩個值相同,則結(jié)果為true

比較引用時,如果引用指向內(nèi)存中的同一對象,結(jié)果為true;

2)equals()作為方法,實現(xiàn)對象的比較。由于==運算符不允許我們進行覆蓋,也就是說它限制了我們的表達。因此我們復(fù)寫equals()方法,達到比較對象內(nèi)容是否相同的目的。而這些通過==運算符是做不到的。

2.object類的equals()方法的比較規(guī)則為:如果兩個對象的類型一致,并且內(nèi)容一致,則返回true,這些類有:

java.io.file,java.util.Date,java.lang.string,包裝類(Integer,Double等)

String s1=new String("abc");

String s2=new String("abc");

System.out.println(s1==s2);

System.out.println(s1.equals(s2));

運行結(jié)果為false true。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容