国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

初涉繼承,關(guān)于java中重寫hashcode()方法的問題

瀏覽:89日期:2024-02-17 08:34:34

問題描述

問題解答

回答1:

實現(xiàn)hashCode方法的通用約定

在應(yīng)用程序的執(zhí)行期間,只要對象的equals方法的比較操作所用到的信息沒有被修改,那么對這個同一對象調(diào)用多次,hashCode方法必須始終如一地返回同一個整數(shù)。在同一個應(yīng)用程序的多次執(zhí)行過程中,每次執(zhí)行所返回的整數(shù)可以不一致。

如果兩個對象根據(jù)equals(Object)方法比較是相等的,那么調(diào)用這兩個對象中任意一個對象的hashCode方法都必須產(chǎn)生同樣的整數(shù)結(jié)果。反之,如果兩個對象hashCode方法返回整數(shù)結(jié)果一樣,則不代表兩個對象相等,因為equals方法可以被重載。

如果兩個對象根據(jù)equals(Object)方法比較是不相等的,那么調(diào)用這兩個對象中任意一個對象的hashCode方法,則不一定要產(chǎn)生不同的整數(shù)結(jié)果。但,如果能讓不同的對象產(chǎn)生不同的整數(shù)結(jié)果,則有可能提高散列表的性能。

hashCode散列碼計算(來自:Effective Java)

把某個非零的常數(shù)值,比如17,保存在一個名為result的int類型的變量中。

對于對象中每個關(guān)鍵域f(指equals方法中涉及的每個域),完成以下步驟:

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

如果該域是boolean類型,則計算(f?1:0)。

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

如果該域是long類型,則計算(int)(f^(f>>>32))。

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

如果該域是double類型,則計算Double.doubleToLongBits(f),然后按照步驟2.1.3,為得到的long類型值計算散列值。

如果該域是一個對象引用,并且該類的equals方法通過遞歸地調(diào)用equals的方式來比較這個域,則同樣為這個域遞歸地調(diào)用hashCode。如果需要更復(fù)雜的比較,則為這個域計算一個范式(canonical representation),然后針對這個范式調(diào)用hashCode。如果這個域的值為null,則返回0(其他常數(shù)也行)。

如果該域是一個數(shù)組,則要把每一個元素當(dāng)做單獨的域來處理。也就是說,遞歸地應(yīng)用上述規(guī)則,對每個重要的元素計算一個散列碼,然后根據(jù)步驟2.2中的做法把這些散列值組合起來。如果數(shù)組域中的每個元素都很重要,可以利用發(fā)行版本1.5中增加的其中一個Arrays.hashCode方法。

按照下面的公式,把步驟2.1中計算得到的散列碼c合并到result中:result = 31 * result + c; //此處31是個奇素數(shù),并且有個很好的特性,即用移位和減法來代替乘法,可以得到更好的性能:`31*i == (i<<5) - i, 現(xiàn)代JVM能自動完成此優(yōu)化。

返回result

檢驗并測試該hashCode實現(xiàn)是否符合通用約定。

示例實現(xiàn)

@Overridepublic int hashCode() { int result = 17; result = 31 * result + (origin == null ? 0 : origin.hashCode()); result = 31 * result + (hsNumber == null ? 0 : hsNumber.hashCode()); result = 31 * result + (imageUrl == null ? 0 : imageUrl.hashCode()); result = 31 * result + (classificationName == null ? 0 : classificationName.hashCode()); return result;}回答2:

java的int固定為32位。另外你的latitude和longtitude是double..我覺得會是64位。

hashcode 和equals 這兩方法是有約定的語義的,你可以看一下 Object

你寫的那個equals我覺得可以用。

注意: Object類中的約定其實是個很弱的約束。我們可以寫出這樣的hashcode()和equals()而不違反約定;

public int hashcode() { return 0;}public boolean equals(Object o) { return (o != null) && (o.getClass() == getClass());}

所以真正的問題在于 你如何定義相等。代碼是次要的。如果定義相等為'經(jīng)度和緯度分別相等',那么你給的代碼是一個可以用的方案 (但不是唯一的可用方案)。

標簽: java
主站蜘蛛池模板: 国内精品久久久久影院网站 | 我要看欧美精品一级毛片 | 538在线视频二三区视视频 | 怡红院免费播放全部视频 | 国产一区自拍视频 | 国产a不卡 | 国内精品小视频 | 亚洲国产成人久久笫一页 | 成人欧美一区二区三区视频xxx | 国产三级久久 | 生活片毛片 | 三级毛片三级毛片 | 亚洲欧美国产日韩天堂在线视 | 亚洲精品国产一区二区三 | 97se亚洲综合在线 | 在线视频久久 | 91热成人精品国产免费 | 免费女人18毛片a级毛片视频 | 亚洲视频男人的天堂 | 全国男人的天堂天堂网 | 亚洲欧洲一区二区 | 成人99国产精品一级毛片 | 成人午夜在线视频 | 免费中文字幕一级毛片 | 女人扒开腿让男人捅啪啪 | 久久欧美| 91欧洲在线视精品在亚洲 | 一级毛毛片毛片毛片毛片在线看 | 国产高清美女一级a毛片久久w | 欧美午夜三级我不卡在线观看 | 欧美精品hdxxxxx | 国内精品久久久久影院网站 | 亚洲精品色综合色在线观看 | 欧美日韩无 | 国产大片线上免费观看 | 亚洲精品久久99久久一区 | 久久久久久久久久久9精品视频 | 久久综合丁香 | 波少野结衣在线播放 | 一级色网站 | 国产在线观看成人 |