3 回答
TA贡献1876条经验 获得超7个赞
你的问题是与地方元素的单一性根据双方计算的集合.equals()和.hashCode(),在一个实例键HashMap。
顾名思义,它依赖于哈希表,而哈希桶是对象的函数.hashCode()。
如果你有两个对象.equals(),但是有不同的哈希码,你就输了!
这里合同的重要部分是:必须具有相同的对象.equals().hashCode()。
这些都记录在javadoc中Object。和约书亚·布洛克说,你必须这样做在有效的Java。说够了。
TA贡献1911条经验 获得超7个赞
根据文档,hashCode的默认实现将返回一些对于每个对象不同的整数
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但
JavaTM编程语言不需要此实现技术。)
但是,有时您希望哈希码对于具有相同含义的不同对象是相同的。例如
Student s1 = new Student("John", 18);
Student s2 = new Student("John", 18);
s1.hashCode() != s2.hashCode(); // With the default implementation of hashCode
如果在集合框架中使用散列数据结构(如HashTable,HashSet),则会出现此类问题。特别是对于像HashSet这样的集合,你最终会有重复元素并违反Set契约。
TA贡献1820条经验 获得超9个赞
是的,它应该被覆盖。如果您认为需要覆盖equals(),则需要覆盖hashCode(),反之亦然。hashCode()的一般契约是:
每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。
如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
添加回答
举报