1. 程式人生 > >重寫equals()時為什麼也得重寫hashCode()

重寫equals()時為什麼也得重寫hashCode()

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()呢?這個問題,後期查了再更新,我也有這個疑惑。