一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java中重寫equals和重寫hashCode()

java中重寫equals和重寫hashCode()

2020-09-06 14:37Java之家 Java教程

這篇文章主要介紹了java中重寫equals和重寫hashCode()的相關資料,需要的朋友可以參考下

java重寫equals和重寫hashCode()

記得在剛上初一的時候,第一堂數(shù)學課學的是集合,那時候我知道了集合是不允許重復元素存在的。

hashCode 方法用于散列集合的查找,equals 方法用于判斷兩個對象是否相等。

為什么重寫了 equals 方法,還要重寫 hashCode 方法?

因為如果只重寫了 equals 方法,兩個對象 equals 返回了true,但是如果沒有重寫 hashCode 方法,集合還是會插入元素。這樣集合中就出現(xiàn)了重復元素了。

接下來詳細分析,以 HashMap 的 put 方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public V put(K key, V value) { 
 
   if (key == null
     return putForNullKey(value); 
 
   //通過key的hashcode計算hash值
   int hash = hash(key.hashCode()); 
   //通過hash值和table數(shù)組的長度計算出元素存放在table數(shù)組的位置
   int i = indexFor(hash, table.length); 
 
   //table[i]的位置已經(jīng)存在元素,遍歷鏈表
   for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
     Object k; 
 
     //調用 equals 方法判斷key是否相等,若相等,該key對應的鍵值對已經(jīng)存在,用新的value取代舊的value
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 
       V oldValue = e.value; 
       e.value = value; 
       e.recordAccess(this); 
       return oldValue; 
     
   
 
   modCount++;
   // 若該key對應的鍵值對不存在,將key-value封裝成Entry對象添加到table[i]處 ,頭插法。
   addEntry(hash, key, value, i); 
   return null
 

1.HashMap 的 put 方法實際上是先調用 hashCode 定位到數(shù)組的位置

2.如果該數(shù)組的位置上已經(jīng)存在元素了,即 table[i] != null,那么遍歷鏈表,調用 equals 方法判斷key是否相等。如果相等,表明這個key對應的鍵值對已經(jīng)存在,那么新的 value 會覆蓋掉舊的 value。如果遍歷鏈表都沒有找到key,那么表明這個 key 對應的鍵值對不存在,直接插入,作為鏈表的頭節(jié)點。

總結

  • 往HashMap添加元素的時候,需要先定位到在數(shù)組的位置(hashCode方法)。
  • 如果只重寫了 equals 方法,兩個對象 equals 返回了true,集合是不允許出現(xiàn)重復元素的,只能插入一個。
  • 此時如果沒有重寫 hashCode 方法,那么就無法定位到同一個位置,集合還是會插入元素。這樣集合中就出現(xiàn)了重復元素了。那么重寫的equals方法就沒有意義了。

如下圖:

java中重寫equals和重寫hashCode()

如果重寫了hashcode方法,確保兩個對象都能夠定位到相同的位置,那么就可以遍歷這條單向鏈表,使用equals方法判斷兩個對象是否相同,如果相同,那么就不插入了(HashMap的實現(xiàn)仍然插入,但是覆蓋掉舊的value)。如果不相同,就插入到鏈表的頭節(jié)點處。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/xyh269/article/details/69171545

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久er99热精品一区二区 | www.尤物 | 99色在线播放 | 久久精品观看影院2828 | 色中色导航 | 九九精品国产 | 91香蕉国产在线观看人员 | 久久精品国产免费播放 | 色悠久久久久综合欧美99 | 亚洲成人99 | 欧美一区二区三区在线观看不卡 | 国产精品日韩欧美一区二区三区 | 艾秋果冻麻豆老狼 | 色综合综合色 | 小伙无套内射老女人 | 国产绳艺在线播放 | 操日日 | 国内小情侣一二三区在线视频 | 男女污网站 | 爆操萝莉 | 天堂va亚洲va欧美va国产 | 日韩欧美天堂 | 母乳在线 | 性关系视频免费网站在线观看 | 成人精品视频一区二区在线 | 四虎在线观看 | 黑人破中国女人处 | 国产精品青青青高清在线 | 美女漫画网 | 亚洲毛片基地 | 91视在线国内在线播放酒店 | 538精品视频| 欧美国产日韩在线 | 国产精品suv一区二区 | 午夜性色一区二区三区不卡视频 | 侮辱丰满美丽的人妻 | 国产在线精品一区二区高清不卡 | 成人免费观看网欧美片 | 久久综合网久久综合 | 三级伦理在线播放 | 欧美国产日本高清不卡 |