<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
平時在開發中,相信你多多少少都使用過HashMap
,而當你用自定義物件作為key
時,很多人會告訴你:你必須要同時實現自定義物件的hashCode、equals
方法,否者可能會出問題,於是你就實現了...
可是為什麼呢?比如這裡有自定義物件Person
,構造如下:
public class Person { private String name; private int age; private float height; }
欲將Person
作為HashMap的key
,放入雜湊表中儲存資訊。我們來探討一下,為什麼要同時實現hashCode、equals
方法吧~
Person p1 = new Person("ciusyan", 21, 1.8f); Person p2 = new Person("ciusyan", 21, 1.8f); Map<Person, String> map = new HashMap<>(); map.put(p1, "Ciusyan"); map.put(p2, "Zhiyan");
首先要明確:
hashCode
方法用於計算出物件的雜湊值equlas
方法用於比較兩個物件是否相等倘若你瞭解雜湊表的基本構造,可以畫出一個草圖:
我們並沒有實現hashCode、equals
方法,為什麼還能放入雜湊表中呢?
JDK
會有預設實現在預設的實現中:
hashCode
方法計算出的雜湊值是不同的equals
方法比較,p1和p2
不是一個物件(不同雜湊值計算出的索引不一樣)
(不同雜湊值也可能會計算出相同的索引)
,又因為是不同物件,所以會被串起來如果我們實現了hashCode
方法,會有什麼不同呢?
@Override public int hashCode() { int hash = Integer.hashCode(age); hash = hash * 31 + Float.hashCode(height); hash = hash * 31 + (name == null ? 0 : name.hashCode()); return hash; }
如上實現,既滿足了儘量用的所有資訊,也使計算的值儘量唯一了
如果是現在,我們再來畫一幅草圖:
現在只實現了hashCode
方法:
hashCode
方法計算出的雜湊值是相同的equals
方法是預設實現,p1和p2
不是一個物件如果我們實現了equals
方法,會有什麼不同呢?
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || o.getClass() != getClass()) return false; Person p = (Person) o; return p.age == age && p.height == height && (Objects.equals(name, p.name)); }
如上實現,如果兩個物件的age、name、height
都相等,那麼可以認為是同一個物件
如果是現在:
現在只實現了equals
方法:
hashCode
方法是預設實現,計算出的雜湊值是不同的equals
方法比較,p1和p2
是同一個物件(計算出的索引不一樣)
(不同雜湊值也可能會計算出相同的索引)
,又因為是同一物件,所以p2的鍵和值會覆蓋掉p1的倘若我們用上面的實現方式,將hashCode和equals
方法都實現了
來看看最終的結構:
現在hashCode、equals
方法都實現了:
hashCode
方法計算出的雜湊值是相同的equals
方法比較,p1和p2
是同一個物件所以放入雜湊表中的大致結構如上圖所示:
(相同的雜湊值計算出的索引相同)
,又因為是同一物件,所以p2的鍵和值會覆蓋掉p1如果你想要用自定義物件作為HashMap的key
,為什麼hashCode、equals
方法都要實現?
相信你看完了四種情況,應該能說出個balabala...
那我們一起來balabala一下吧~
hashCode
方法計算出雜湊值:
equals
方法檢視是否是相同的物件。
equlas
方法;equals
一般的開發需求會是第四種,想要用p1和p2
作為key
儲存資料,會認為它們是同一個物件,它們是同一個key
,也就只會儲存一份資料。所以如果不同時實現hashCode、equals
方法,會有圖中的種種問題。
以上就是Java開發HashMap key必須實現hashCode equals方法原理的詳細內容,更多關於Java開發HashMap key的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45