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().
| 归档时间: |
|
| 查看次数: |
15163 次 |
| 最近记录: |