为什么java中的默认hashcode()不好?

Huk*_*ABA 4 java hash hashcode

如果我没记错的话,在Object()类型的对象的java中默认的hashCode()实现是返回对象的内存地址.当我们创建自己的类时,我读到我们想要覆盖hashCode(),这样当我们将它们插入到哈希相关的集合(如HashMap())时,它将正常工作.但为什么内存地址不好?

当然,我们将永远耗尽内存而你会发生冲突,但我认为这是一个问题的唯一情况是你处理TONS数据并且内存很少,然后它会开始影响性能,因为java中的哈希相关集合通过链接解决冲突(桶将链接到解析为相同哈希码/索引的值列表).

Joh*_*ica 24

如果每个对象都是唯一的,则默认实现工作正常.但是如果你重写equals(),那么你隐含地说具有不同地址的对象可以彼此相同.在这种情况下,您还必须覆盖hashCode().

想想String类.

String s1 = new String("foo");
String s2 = new String("foo");
Run Code Online (Sandbox Code Playgroud)

这两个字符串相等,因此它们的哈希码必须相等.但它们是具有不同地址的不同对象.

s1 == s2         // false, different addresses
s1.equals(s2)    // true, same contents
Run Code Online (Sandbox Code Playgroud)

使用他们的地址作为哈希码将是一个错误.因此,String会覆盖hashCode()以确保相等的字符串具有相同的哈希码.这有助于满足hashCode()的契约,即:

如果a.equals(b)是,那么a.hashCode() == b.hashCode().

底线:如果重写equals(),也会覆盖hashCode().


Ria*_*iaD 0

虽然您不使用equals方法,但不定义也可以hashCode,但在合同之后,hashCode为对象提供相同的结果,即等于。你不能确定它会,所以你需要自己重写

哈希码