博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

hashCode和equals

Posted on 2021-03-25 20:46  南国木棉  阅读(40)  评论(0编辑  收藏  举报

 

hashCode简介

    hashCod()作用 是获取哈希码,也称为散列码;他实际上是返回一个int整数,这个哈希码的作用是确定该函数哈希表中的索引位置。hashCode定义在JDK的Object.java中,Java中的任何类都包含有hashCode()函数。

  散列表存储的是键值对,他的特点是:能根据 “键” 快速的检索出对应的 “值”,这其中就用到了散列码。因为hashcode算法原因,不同的两个对象,可能计算出两个相同的hashCode。

 

 为什么要有hashCode?

  以hashSet如何检查重复来说明为什么会有hashCode:

  对象加入hashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,看该位置是否有值,如果没有,HashSet会认为对象没有重复出现。如果有值,这时会调用equals()方法来检查两个对象是否真的相同,如果两者相同,

  HashSet就不会让其加入操作成功,如果不同的话,就会重新散列到其他位置,这样就大大减少了equals的次数,相应的就大大提高了运行的速度。

  

  如果两个对象相等,则hashCode一定是相同的。

  两个对象相等,对两个对象分别调用equals方法都是返回true

  两个对象有相同的hashCode值,他们也不一定相等

  因此,equals方法被覆盖过,则hashCode方法必须被覆盖。

  hashCode()的默认行为是对堆上的对象产生独特值,如果没有重写hashCode,则该class的两个对象无论如何都不会相等,即使这两个对象指向相同的数据。

 

    为什么重写equals一定要重写hashCode方法那?

  因为equals方法比较相同的,hashCode一定相同,所以为了保证equals相同的hashCode相同,就必须重写hashCode方法。