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。