equals和hashcode是object類下一個重要的方法,而object類是所有類的父類,所以所有的類都有這兩個方法
equals和hashcode間的關系:
1.如果兩個對象相同(即equals比較返回true),那么他們的hashcode一定要相等
2.如果他們的hashcode相等,他們的equals不一定相等
假設兩個對象,重寫了其equals方法,其相等條件是屬性相等,equals比較之后返回true說明假設的兩個對象相等,如果沒有重寫hashcode的話,其返回的依然是兩個對象的內存地址,那么他們的hashcode不相同,這和上面的equals和hashcode間的關系相矛盾!
思維發散與點滴感悟:
由於為了提高程序的效率才實現了hahscode方法,先進行hashcode比較,如果不同就沒必要進行equals比較了,這樣大大減少了equals比較的次數,當比較的數量大的時候提高的效率就很可觀!比如在set集合中:
java中set集合是無序的,不能重復,那怎么保證不重復呢?單靠equals方法比較的話,如果集合中本來就有100000個元素,現在放入1000個元素,難道要將前面所有的元素都進行比較一遍?OMGD,這個效率是超級慢的,因此hashcode就大顯身手了,java采用了hash表,利用了hash算法(散列算法),就是將對象數據根據該對象的特征使用特定的算法將其定義到一個地址上,那么后面進來的數據只要看對應的hashcode地址上是否有值,沒有的話就直接插入,有的話不進行任何操作,這樣就大大減少了equals的比較次數(因為兩個不同的對象其hash也可能是相等的,所有還是需要進行equals的比較的,這樣效率就大大提高了!
所以總結回答一下:為什么重寫equals還要重寫hashcode???
其實簡單的說就為了保證同一個對象,保證在equals相等的情況下hashcode值必定相等,如果重寫了equals而沒有重寫hashcode的話,可能會出現兩個沒有關系的對象equals相等(equals根據特征值進行比較),但hashcode不相同的情況,違背了equals和hashcode間的關系!