重寫equals()時為什麼也得重寫hashCode()
阿新 • • 發佈:2019-02-07
1.hashCode()方法
hashCode()方法是Object的一個方法,通過方法可以計算出呼叫物件的雜湊值,也就是該物件的儲存地址。
很多類在改寫equals()方法後,都改寫過hashCode()方法。
比如String:
String str =”myHome” ;
String str1 = new String(“myHome”);
str == str1 //返回false,因為它們的儲存地址不一樣
//但是
str.hashCode() == str1.hashCode() //返回true。因為String類改寫了hashCode()方法,此時的hashCode()方法並不是計算物件的儲存地址了。
2.重寫equals()但不重寫hashCode()
對於Map集合來說,可以通過map.get(key)來獲取value的值。其中的過程與map集合的結構有關,簡單來說就是通過計算key的雜湊值,來獲取value的對映地址,從而找到value。
那麼,問題來了。
此時有一個類KeyClass,它重寫了equals()方法,但是沒有重寫hashCode()方法。
則:
KeyClass key1 = new KeyClass("myHome"); KeyClass key2 = new KeyClass("myHome"); Map map = new Map(); map.put(key1,"Hello"); map.get(key1); // Hello map.get(key2); //null
由於重寫了equals(),很顯然 key1.equals(key2) 返回ture。
但是由於KeyClass類沒有重寫hashCode,所以key1.hashCode()和key2.hashCode()呼叫的是Object類的,計算的是這兩個的儲存地址,顯然不一樣。所以在map中儲存key1的雜湊值,在map.get(key2)是獲取不到value的值。
以上便是為什麼重寫equals()時也得重寫hashCode()。
如果不是用在map集合上,是否一定要重寫hashCode()呢?這個問題,後期查了再更新,我也有這個疑惑。