日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第9条:覆盖equals时总要覆盖hashCode

發布時間:2024/4/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第9条:覆盖equals时总要覆盖hashCode 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在每個覆蓋equals方法的類中,也必須覆蓋hashCode方法。否則,會違反Object.hashCode的通用約定,從而導致該類無法結合所有基于散列的集合一起正常工作,包括HashMap,HashSet,Hashtbale。

?

hashCode約定內容:

1.只要對象equals方法的比較操作所用到的信息沒有被修改,對同一對象調用多次,hashCode方法都必須返回同一整數。在同一應用程序的多次執行過程中,每次執行返回的整數可以不一致。

2.如果兩個對象根據equals(Object)方法比較是相等的,那么這兩個對象的hashCode返回值相同。

3.如果兩個對象根據equals(Object)方法比較是不等的,那么這兩個對象的hashCode返回值不一定不等,但是給不同的對象產生截然不同的整數結果,能提高散列表的性能。

?

考慮:

public class PhoneNumber {private final int areaCode;private final int prefix;private final int lineNumber;public PhoneNumber(int areaCode, int prefix, int lineNumber) {rangeCheck(areaCode, 999, "area code");rangeCheck(prefix, 999, "prefix");rangeCheck(lineNumber, 9999, "line number");this.areaCode = areaCode;this.prefix = prefix;this.lineNumber = lineNumber;}private static void rangeCheck(int arg, int max, String name) {if(arg < 0 || arg > max) {throw new IllegalArgumentException(name + ": " + arg);}}@Overridepublic boolean equals(Object o) {if(o == this)return true;if(!(o instanceof PhoneNumber))return false;PhoneNumber pn = (PhoneNumber)o;return pn.lineNumber == lineNumber&& pn.prefix == prefix&& pn.areaCode == areaCode;}}

運行下面代碼:

Map<PhoneNumber, String> map = new HashMap<PhoneNumber, String>(); map.put(new PhoneNumber(707, 867, 5309), "Jenny"); System.out.println(map.get(new PhoneNumber(707, 867, 5309)));

我們期望它返回Jenny,然而它返回的是null。

原因在于違反了hashCode的約定,由于PhoneNumber沒有覆蓋hashCode方法,導致兩個相等的實例擁有不相等的散列碼,put方法把電話號碼對象放在一個散列桶中,get方法從另外一個散列桶中查找這個電話號碼的所有者,顯然是無法找到的。

只要覆蓋hashCode并遵守約定,就能修正這個問題。

?

一個好的散列函數傾向于“為不相等的對象產生不相等的散列碼”,下面有簡單的解決辦法:

1.把某個非零的常數值,如17,保存在一個名為result的int類型的變量中。(為了2.a中計算的散列值為0的初始域會影響到散列值)

2.對于對象中的每個關鍵域f,完成一下步驟:

 a.為該域計算int類型的散列碼c

  i.如果該域是boolean,計算(f ? 1:0)

  ii.如果該域是byte、char、short或者int類型,則計算(int)f

  iii.如果該域是long,則計算(int)(f ^ (f >>> 32))

  iv.如果該域是float,則計算Float.floatToIntBits(f)

  v.如果該域是double,則計算Double.doubleToLongBits(f),然后

?  vi.如果該域是一個對象引用,并且該類的equals方法通過遞歸地調用equals的方式來比較這個域,則同樣為這個域遞歸地調用hashCode。如果需要更復雜的比較,則為這個域計算一個“范式”,然后針對這個“范式”調用hashCode。如果域的值為null,則返回0(或其他某個常數,但通常為0)。

  vii.如果該域是一個數組,則要吧每一個元素當做單獨的域來處理,也就是要遞歸地應用上述規則,對每個重要的元素計算一個散列碼,然后根據2.b把這些散列值組合起來。如果數組域中的每個元素都很重要,可以使用1.5中增加的其中一個Array.hashCode方法。

 b.按照下面的公式,把步驟2.a中計算得到的散列碼c合并到result中:

  result = 31 * result + c。(選擇31是因為它是一個奇素數,如果乘數是偶數,乘法溢出時會丟失信息,VM可以優化 31 * i == (i << 5) - i)

3.返回result。

?

編寫完hashCode方法后,編寫單元測試來驗證相同的實例是否有相等的散列碼。

?

把上面的解決方法應用到PhoneNumber類中:

@Override public int hashCode() {int result = 17;result = 31 * result + areaCode;result = 31 * result + prefix;result = 31 * result + lineNumber;return result; }

現在使用之前的測試代碼,發現能夠返回Jenny了。

?

如果一個類是不可變的,并且計算散列碼的開銷很大,應該考慮把散列碼緩存到對象內部而不是每次請求都重新計算散列碼,如果這種類大多數對象會被用作散列鍵,應該在創建實例的時候計算散列碼,否則可以選擇延遲初始化散列碼。

?

注意:不要試圖從散列碼計算中排除掉一個對象的關鍵部分來提高性能。雖然這樣做運行起來可能更快,但效果不見得好,在擁有大量實例的時候,忽略的域區別仍然非常大,但散列函數仍然把它們映射到同樣的散列桶中,例如Java 1.2之前實現的String散列函數至多檢查16個字符,對于像URL這樣的大型集合,散列函數表現出病態的行為(把第16個字符后相差非常大的URL映射到同樣的散列桶中,使得碰撞率很高,性能降低)。

轉載于:https://www.cnblogs.com/13jhzeng/p/5644368.html

總結

以上是生活随笔為你收集整理的第9条:覆盖equals时总要覆盖hashCode的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲av成人片无码 | 国产免费一区视频观看免费 | 一级片www | 国产一级aa大片毛片 | 国产成人高清 | 绝顶高潮合集videos | 草草福利视频 | 欧美熟妇一区二区 | 影音先锋蜜桃 | 深夜福利网 | 亚洲精品中文字幕在线播放 | 国产 丝袜 欧美中文 另类 | 精品人妻一区二区三区换脸明星 | 亚洲国产日韩欧美在线观看 | 久久国产精品-国产精品 | 久久中文字幕精品 | 天堂资源站 | 亚洲三级精品 | 中国挤奶哺乳午夜片 | 深爱五月综合网 | 欧美黑人添添高潮a片www | 婷婷一区二区三区四区 | 亚洲视频一区二区三区 | h片在线观看免费 | 五月六月婷婷 | 国产成人无码精品久在线观看 | 午夜一区二区三区免费观看 | 黄色大片网址 | 中文字幕日韩精品亚洲一区小树林 | 性――交――性――乱睡觉 | 天天色天 | 精品国产一区二区三区久久久蜜月 | 国产又大又黄视频 | 国产美女福利在线 | 久久乐av | 国产一级片网址 | 精品动漫一区二区三区在线观看 | jizz18欧美18| 亚洲精品视频中文字幕 | 婷婷玖玖 | 免费视频色| 国产女主播在线观看 | 2019中文字幕在线 | 青青草原成人网 | 天天草夜夜操 | 人妖被c到高潮欧美gay | 蜜桃又黄又粗又爽av免 | 国产午夜精品理论片 | 婷婷亚洲综合 | 成年人免费观看视频网站 | 国产一级特黄视频 | 亚洲色图丝袜美腿 | 动漫涩涩免费网站在线看 | 素人fc2av清纯18岁 | 黄色在线小视频 | 国产污视频在线播放 | 99热这里只有精品在线观看 | 国产成人在线播放视频 | 国产免费自拍视频 | 超级碰在线视频 | 麻豆私人影院 | 精品欧美一区二区久久久久 | 亚洲乱熟女一区二区三区小说 | 综合精品在线 | 就是色 | 又紧又大又爽精品一区二区 | 亚洲大片免费看 | 国产精品永久免费视频 | 99在线观看免费 | 午夜免费成人 | 国产一区日本 | 国产成人在线精品 | 成人a视频 | 在线a毛片 | 青娱网电信一区电信二区电信三区 | 蜜桃在线一区二区 | 白嫩初高中害羞小美女 | 色94色欧美 | 国产大片一区 | www.色图 | 99久久婷婷国产综合精品电影 | 日本免费一二区 | 亚洲精品久久久久久久久久久久久 | 国产亚洲精品久久久久久打不开 | 亚洲第一页夜 | 亚洲精品成人a | 国产一区二区啪啪啪 | 殴美毛片 | 欧美男人操女人 | 国产成人久久精品77777综合 | 黄色片免费网站 | 新香蕉视频 | 国产性猛交╳xxx乱大交一区 | 91福利一区二区 | 强侵犯の奶水授乳羞羞漫虐 | 午夜草草 | 男女裸体影院高潮 | 成人av动漫在线观看 | 免费av资源|