Java中hashCode的作用

hashCode的作用

java.lnag.Object中对hashCode的约定:

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
    实际上,Object类定义的hashCode方法会将本对象的内部地址转换成一个整数,以此来为不同的对象尽量返回不同的哈希值。

在Java中,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。

在向这些基于散列表的集合中插入数据时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值,就调用它的equals方法与新元素进行比较,如果相同,就不再重复存储,如果不相同,说明仍然是两个不同的对象,需要继续存储,但是相同的哈希值的不同对象如何存入这些集合呢,这里还存在一个冲突解决的问题。
实际上,当两个不同对象的hashCode相同时,会把这两个对象存在hashmap中同一索引的位置下的链表上。两个不同的对象分别存在同一索引下的链表的不同位置上,也就是说hashmap中同一个索引位置是可能存着多个对象的。这样一来实际调用equals方法的次数就大大降低了。所以,命中率更低的hashCode算法,能有效提高这些基于散列表的集合的操作速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值