在重寫equals時還必須重寫hashcode方法

2022-09-11 21:06:29 字數 1078 閱讀 4492

string類的原始碼:可以發現string是重寫了object類的equals方法的,並且也重寫了hashcode方法

public boolean equals(object anobject)

if (anobject instanceof string)

return true;}}

return false;

}public int hashcode()

hash = h;

}return h;

}那為什麼在重寫equals方法時都要重寫equals方法呢:

首先equals與hashcode間的關係是這樣的:

1、如果兩個物件相同(即用equals比較返回true),那麼它們的hashcode值一定要相同;

2、如果兩個物件的hashcode相同,它們並不一定相同(即用equals比較返回false)   

自我的理解:由於為了提高程式的效率才實現了hashcode方法,先進行hashcode的比較,如果不同,那沒就不必在進行equals的比較了,這樣就大大減少了equals比較的次數,這對比需要比較的數量很大的效率提高是很明顯的,乙個很好的例子就是在集合中的使用;我們都知道j**a中的list集合是有序的,因此是可以重複的,而set集合是無序的,因此是不能重複的,那麼怎麼能保證不能被放入重複的元素呢,但靠equals方法一樣比較的話,如果原來集合中以後又10000個元素了,那麼放入10001個元素,難道要將前面的所有元素都進行比較,看看是否有重複,歐碼噶的,這個效率可想而知,因此hashcode就應遇而生了,j**a就採用了hash表,利用雜湊演算法(也叫雜湊演算法),就是將物件資料根據該物件的特徵使用特定的演算法將其定義到乙個位址上,那麼在後面定義進來的資料只要看對應的hashcode位址上是否有值,那麼就用equals比較,如果沒有則直接插入,只要就大大減少了equals的使用次數,執行效率就大大提高了。繼續上面的話題,為什麼必須要重寫hashcode方法,其實簡單的說就是為了保證同乙個物件,保證在equals相同的情況下hashcode值必定相同,如果重寫了equals而未重寫hashcode方法,可能就會出現兩個沒有關係的物件equals相同的(因為equal都是根據物件的特徵進行重寫的),但hashcode確實不相同的

重寫equals時還必須重寫hashCode方法

1.public boolean equals object obj 和 hashcode 方法是object物件中的方法 2.equals 與 hashcode間的關係是這樣的 a.如果兩個物件相同 即用equals比較返回true,那麼它們的 hashcode 值一定要相同 b.如果兩個物件的 ...

為什麼重寫equals必須重寫hashCode呢

在理解這個問題時,我認為最先理解的應該是為什麼會重寫equals呢?理解清楚這個的前提下才有必要去理解為什麼需要去重寫hashcode!為什麼需要重寫equals方法呢?我認為是為了適應業務場景的需求而需要對類的equals方法進行重寫,最經典的重寫equals方法的例子莫過於string類了,在o...

IDEA 重寫equals重寫toString

重寫equals方法 idea中直接輸入eq回車進入重寫方法 第二步如果obj這個物件連學生 student 這個型別都不是,那麼肯定返回false if obj instanceof student 第三步如果是學生型別,強制把obj轉換成學生物件,不轉換預設是objeke student s s...