亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為啥containsKey()方法不需要重寫equals()方法????

為啥調用congtainsKey()的時候沒有出現錯誤???

正在回答

4 回答

如果key是自定義類型,那就要重寫equals方法,而且還要重寫hashcode方法。這邊的String類型已經重寫了hashcode方法和equals方法。自定義的類型都要重寫equals。至于要不要重寫hashCode,看你是否實現的hash的接口,或者你繼承的父類是不是實現了,不是,不用重寫。是就要重寫。

要重寫hashCode方法主要是源碼里調用了hash方法的。

Hashmap;可以看見containsKey有hash

public?boolean?containsKey(Object?key)?{
????return?getNode(hash(key),?key)?!=?null;
}
public?synchronized?boolean?contains(Object?value)?{
????if?(value?==?null)?{
????????throw?new?NullPointerException();
????}

????Entry<?,?>?tab[]?=?table;
????for?(int?i?=?tab.length?;?i--?>?0?;)?{
????????for?(Entry<?,?>?e?=?tab[i]?;?e?!=?null?;?e?=?e.next)?{
????????????if?(e.value.equals(value))?{
????????????????return?true;
????????????}
????????}
????}
????return?false;
}

HashSet:也有hash方法

public?boolean?containsKey(Object?key)?{
????return?getNode(hash(key),?key)?!=?null;
}

ArrayList;并沒有調用hash方法,indexOf同樣也沒有調用

public?boolean?contains(Object?o)?{
????return?indexOf(o)?>=?0;
}


0 回復 有任何疑惑可以回復我~

湊巧Key是String類型的,String重寫過了equals

0 回復 有任何疑惑可以回復我~

contains() 和 containsKey()都會調用equals()方法

參數為String類型的equals方法和以對象為類型的equals方法不同。

equals(String key)會同時比較地址和內容,其中一個為true的時候返回true。

equals (Object value)只會比較地址是否相同,地址相同的時候返回true。

因此要重寫equals方法之后才能使用containsKey方法(否則只會比較地址,而不會比較學生姓名)。containsKey由于參數是String,所有默認的equals就會比較值和地址,就不需要重寫了。

1 回復 有任何疑惑可以回復我~

containsKey()和containsValue()都調用了equals()方法進行比較,但是這個題目中的key是String類型的,String類型的equals()比較的是字符串的內容,所以我們根據鍵去查找學生的結果是true;但是Value是Student類型的,equals()比較的是對象的引用地址,所以返回結果是false。那么就需要重寫equals()方法。

1 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

為啥containsKey()方法不需要重寫equals()方法????

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號