【面題解析】用Object做hashMap的Key時需要做什么?

源 / 文/
先來說一下hashcode()和equals方法吧。
hashcode()
hashCode 的存在主要用于查找的快捷性,如 Hashtable, HashMap 等,hashCode 是用來在三列存儲結(jié)構(gòu)中確定對象的存儲地址的。 如果兩個對象相同,就是適用于 euqals(java.lang.Object) 方法,那么這兩個對象的 hashCode一定相同。 如果對象的euqals 方法被重寫,那么對象的 hashCode 也盡量重寫,并且產(chǎn)生 hashCode 使用的對象,一定要和 equals 方法中使用的一致,否則就會違反上面提到的第二點。 兩個對象的 hashCode 相同,并不一定表示這兩個對象就相同,也就是不一定適用于equals() 方法,只能夠說明這兩個對象在三列存儲結(jié)構(gòu)中,如 Hashtable.,他們存在同一個籃子里。以上話以前摘錄自一篇博客,講的非常好。
equals(Object obj)
如果一個類沒有重寫 equals(Object obj)方法,則等價于通過 == 比較兩個對象,即比較的是對象在內(nèi)存中的空間地址是否相等。 如果重寫了equals(Object ibj)方法,則根據(jù)重寫的方法內(nèi)容去比較相等,返回 true 則相等,false 則不相等。
我用一個簡單的demo來舉個例子吧.
public class MyClass {
public static void main(String[] args) {
HashSet books=new HashSet();
books.add(new A());
books.add(new A());
books.add(new B());
books.add(new B());
books.add(new C());
books.add(new C());
System.out.println(books);
}
}
class A{
//類A的 equals 方法總是返回true,但沒有重寫其hashCode() 方法
@Override
public boolean equals(Object o) {
return true;
}
}
class B{
//類B 的hashCode() 方法總是返回1,但沒有重寫其equals()方法
@Override
public int hashCode() {
return 1;
}
}
class C{
public int hashCode(){
return 2;
}
@Override
public boolean equals(Object o) {
return true;
}
}
結(jié)果
即使兩個A 對象通過 equals() 比較返回true,但HashSet 依然把他們當(dāng)成 兩個對象,即使兩個 B 對象 的hashCode() 返回值相同,但HashSet 依然把他們當(dāng)成兩個對象。 即也就是,當(dāng)把一個對象放入HashSet 中時,如果需要重寫該對象對應(yīng)類的 equals() 方法,則也應(yīng)該重寫其 hashCode() 方法。規(guī)則是:如果兩個對象通過 equals() 方法比較返回true,這兩個對象的 hashCode 值也應(yīng)該相同。 如果兩個對象通過euqals() 方法比較返回true,但這兩個對象的 hashCode() 方法返回不同的hashCode 值時,這將導(dǎo)致HashSet 會把這兩個對象保存在 Hash 表的不同位置,從而使兩個對象都可以添加成功,這就與 Set 集合的規(guī)則沖突了。 如果兩個對象的 hashCode() 方法返回的 hasCode 值相同,但他們通過 equals() 方法比較返回false 時將更麻煩:因為兩個對象的hashCode 值相同,HashSet 將試圖 把它們保存在同一個位置,但又不行(否則將只剩下一個對象),所以實際上會在這個位置用鏈?zhǔn)浇Y(jié)構(gòu)來保存多個對象;而HashSet 訪問集合元素時也是根據(jù)元素的 hashCode 值來快速定位的,如果 hashSet 中兩個以上的元素具有相同的 HashCode 值時,將會導(dǎo)致性能下降。
用Object做hashMap的Key時需要做什么?
用自定義類作為key,必須重寫equals()和hashCode()方法。
自定義類中的equals() 和 hashCode()都繼承自O(shè)bject類。

推薦閱讀
7輪面試,耗費30天,我真的差點沒挺過去...
迄今為止程序員寫過的最大Bug:虧損30億、致6人死亡,甚至差點毀滅世界
某程序員自述:我,三十多歲,逃離北上廣,通過技術(shù)移民到加拿大!
END


頂級程序員:topcoding
做最好的程序員社區(qū):Java后端開發(fā)、Python、大數(shù)據(jù)、AI
一鍵三連「分享」、「點贊」和「在看」
評論
圖片
表情



