3 回答

TA貢獻(xiàn)1876條經(jīng)驗 獲得超7個贊
你的問題是與地方元素的單一性根據(jù)雙方計算的集合.equals()和.hashCode(),在一個實例鍵HashMap。
顧名思義,它依賴于哈希表,而哈希桶是對象的函數(shù).hashCode()。
如果你有兩個對象.equals(),但是有不同的哈希碼,你就輸了!
這里合同的重要部分是:必須具有相同的對象.equals().hashCode()。
這些都記錄在javadoc中Object。和約書亞·布洛克說,你必須這樣做在有效的Java。說夠了。

TA貢獻(xiàn)1911條經(jīng)驗 獲得超7個贊
根據(jù)文檔,hashCode的默認(rèn)實現(xiàn)將返回一些對于每個對象不同的整數(shù)
盡可能合理,Object類定義的hashCode方法確實為不同的對象返回不同的整數(shù)。(這通常通過將對象的內(nèi)部地址轉(zhuǎn)換為整數(shù)來實現(xiàn),但
JavaTM編程語言不需要此實現(xiàn)技術(shù)。)
但是,有時您希望哈希碼對于具有相同含義的不同對象是相同的。例如
Student s1 = new Student("John", 18);
Student s2 = new Student("John", 18);
s1.hashCode() != s2.hashCode(); // With the default implementation of hashCode
如果在集合框架中使用散列數(shù)據(jù)結(jié)構(gòu)(如HashTable,HashSet),則會出現(xiàn)此類問題。特別是對于像HashSet這樣的集合,你最終會有重復(fù)元素并違反Set契約。

TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊
是的,它應(yīng)該被覆蓋。如果您認(rèn)為需要覆蓋equals(),則需要覆蓋hashCode(),反之亦然。hashCode()的一般契約是:
每當(dāng)在執(zhí)行Java應(yīng)用程序期間多次在同一對象上調(diào)用它時,hashCode方法必須始終返回相同的整數(shù),前提是不修改對象的equals比較中使用的信息。從應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)不需要保持一致。
如果兩個對象根據(jù)equals(Object)方法相等,則對兩個對象中的每一個調(diào)用hashCode方法必須生成相同的整數(shù)結(jié)果。
如果兩個對象根據(jù)equals(java.lang.Object)方法不相等,則不需要在兩個對象中的每一個上調(diào)用hashCode方法必須生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該知道為不等對象生成不同的整數(shù)結(jié)果可能會提高哈希表的性能。
添加回答
舉報