課程
/后端開發(fā)
/Java
/Java入門第三季
為啥調(diào)用congtainsKey()的時(shí)候沒有出現(xiàn)錯(cuò)誤???
2020-04-05
源自:Java入門第三季 6-4
正在回答
如果key是自定義類型,那就要重寫equals方法,而且還要重寫hashcode方法。這邊的String類型已經(jīng)重寫了hashcode方法和equals方法。自定義的類型都要重寫equals。至于要不要重寫hashCode,看你是否實(shí)現(xiàn)的hash的接口,或者你繼承的父類是不是實(shí)現(xiàn)了,不是,不用重寫。是就要重寫。
要重寫hashCode方法主要是源碼里調(diào)用了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方法
ArrayList;并沒有調(diào)用hash方法,indexOf同樣也沒有調(diào)用
public?boolean?contains(Object?o)?{ ????return?indexOf(o)?>=?0; }
湊巧Key是String類型的,String重寫過了equals
contains() 和 containsKey()都會調(diào)用equals()方法
參數(shù)為String類型的equals方法和以對象為類型的equals方法不同。
equals(String key)會同時(shí)比較地址和內(nèi)容,其中一個(gè)為true的時(shí)候返回true。
equals (Object value)只會比較地址是否相同,地址相同的時(shí)候返回true。
因此要重寫equals方法之后才能使用containsKey方法(否則只會比較地址,而不會比較學(xué)生姓名)。containsKey由于參數(shù)是String,所有默認(rèn)的equals就會比較值和地址,就不需要重寫了。
containsKey()和containsValue()都調(diào)用了equals()方法進(jìn)行比較,但是這個(gè)題目中的key是String類型的,String類型的equals()比較的是字符串的內(nèi)容,所以我們根據(jù)鍵去查找學(xué)生的結(jié)果是true;但是Value是Student類型的,equals()比較的是對象的引用地址,所以返回結(jié)果是false。那么就需要重寫equals()方法。
舉報(bào)
Java中你必須懂得常用技能,不容錯(cuò)過的精彩,快來加入吧
3 回答為什么containskey()不用重寫equals方法呢
2 回答containsValue方法為啥要重寫equals方法?。繂为?dú)重寫hashcode方法不行嗎?
1 回答equals方法重寫
2 回答重寫equals方法
2 回答為什么要重寫equals方法呢
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2020-07-27
如果key是自定義類型,那就要重寫equals方法,而且還要重寫hashcode方法。這邊的String類型已經(jīng)重寫了hashcode方法和equals方法。自定義的類型都要重寫equals。至于要不要重寫hashCode,看你是否實(shí)現(xiàn)的hash的接口,或者你繼承的父類是不是實(shí)現(xiàn)了,不是,不用重寫。是就要重寫。
要重寫hashCode方法主要是源碼里調(diào)用了hash方法的。
Hashmap;可以看見containsKey有hash
HashSet:也有hash方法
ArrayList;并沒有調(diào)用hash方法,indexOf同樣也沒有調(diào)用
2020-05-09
湊巧Key是String類型的,String重寫過了equals
2020-04-30
contains() 和 containsKey()都會調(diào)用equals()方法
參數(shù)為String類型的equals方法和以對象為類型的equals方法不同。
equals(String key)會同時(shí)比較地址和內(nèi)容,其中一個(gè)為true的時(shí)候返回true。
equals (Object value)只會比較地址是否相同,地址相同的時(shí)候返回true。
因此要重寫equals方法之后才能使用containsKey方法(否則只會比較地址,而不會比較學(xué)生姓名)。containsKey由于參數(shù)是String,所有默認(rèn)的equals就會比較值和地址,就不需要重寫了。
2020-04-05
containsKey()和containsValue()都調(diào)用了equals()方法進(jìn)行比較,但是這個(gè)題目中的key是String類型的,String類型的equals()比較的是字符串的內(nèi)容,所以我們根據(jù)鍵去查找學(xué)生的結(jié)果是true;但是Value是Student類型的,equals()比較的是對象的引用地址,所以返回結(jié)果是false。那么就需要重寫equals()方法。