20201113 equals()与hashcode()

发布时间:2021-10-20 18:40:30

思考:使用equal的对比字符串是否相同的代码可以简化;


先对比hashcode值看看是否相等;


几类常见的hash码算法


两个一定。


三千次对比;降低 equals方法的调用次数;提高对比的效率。使用hash算法提高在散列结构中查找的效率。


hashset集合如何保证元素唯一的,通过什么提升对比效率?(hash容器中)


重写了equals方法后,为什么要重写hashCode方法? 该类无法结合所有基于散列的集合一起正常运作。


hashcode方法只有在集合中用到


?


equals方法的作用


1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。


2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。


?


hashCode()方法和equal()方法的区别


这两个方法的作用是一样的,都是用来对比两个对象是否相等一致;


都是用来比较对象是否相等的;equal方法效率低,hashcode效率高,但是不可靠。


重写的equal()方法,一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?


?


hashCode()并不是完全可靠。


有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:


1)equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。


2)hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。


?


对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方案是:1)hashCode对比,2)hashCode如果相同,在进行equal对比;


每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!


?


这种大量的并且快速的对象对比一般使用的hash容器中,比如hashset,hashmap,hashtable等等,比如hashset里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。


?


哈希码(HashCode)


哈希码产生的依据:哈希码并不是完全唯一的,存在多种不同的Hash算法。让同一个类的对象按照不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。


什么是哈希码(HashCode)


在Java中,哈希码代表对象的特征。


例如对象 String str1 = “aa”, str1.hashCode= 3104


?


?


几个常用的哈希码的算法


1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。(内存地址)


2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。(堆空间)


3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。(整数数值)


?


Java对于equals()方法和hashCode()方法的规定


1,如果两个对象equals()方法相等则它们的hashCode返回值一定要相同,如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。


2,两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashcode()返回值不相等则可以判定两个对象一定不相等。


?


2.hashCode()返回值和==的关系


若==返回true,则两边的对象的hashCode()返回值必须相等,若==返回false,则两边对象的hashCode()返回值可能相等,也可能不等,因为Java中对象默认的equals()方法就是用==实现的。而Java对于equals方法和hashCode方法的规定是如果两个对象equals()方法相等,则hashCode值一定会相同,如果两个对象的hashCode值相同,则它们的equals()方法不一定相等。


?


3.Java中的hashCode()的作用


hashCode()的作用是为了提高在散列结构存储中查找的效率,只有每个对象的 hash 码尽可能不同才能保证散列的存取性能,事实上Object类提供的默认实现确实保证每个对象的 hash 码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。


在 Java 有些集合类(Set)中要想保证元素不重复可以在每增加一个元素就通过对象的 equals 方法比较一次,那么当元素很多时后添加到集合中的元素比较的次数就非常多了,也就是说如果集合中现在已经有3000个元素则第 3001个元素加入集合时就要调用 3000 次 equals 方法,这显然会大大降低效率,于是Java 采用了哈希表的原理,这样当集合要添加新的元素时会先调用这个元素的 hashCode方法就一下子能定位到它应该放置的物理位置上(实际可能并不是),如果这个位置上没有元素则它就可以直接存储在这个位置上而不用再进行任何比较了,如果这个位置上已经有元素了则就调用它的 equals 方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址,这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次,而hashCode的值对于每个对象实例来说是一个固定值。


?


4.Java中重写equals()方法时尽量要重写hashCode()方法的原因;


当 equals 方法被重写时通常有必要重写hashCode方法来维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码,如果不这样做的话就会违反 hashCode 方法的常规约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集* HashMap、HashSet、Hashtable 等。


?


5,hashCode 方法的常规约定如下:


1)程序执行期间只要对象equals方法比较操作所用到的信息没有被修改,则对这同一个对象无论调用多次hashCode方法都必须返回同一个整数。


2)如果两个对象根据equals方法比较是相等的则调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。


3)如果两个对象根据equals方法比较是不相等的,则调用这两个对象中任意一个对象的 hashCode 方法不一定要产生相同的整数结果(尽量保证不相等的对象产生截然不同的整数结果是可以提高散列表性能的)。


?


https://blog.csdn.net/bailu666666/article/details/81153815


?

相关文档

  • sudo: arm-linux-gnueabihf-gcc: command not found解决方法
  • 有关阅读的乐趣初中优秀范文
  • 初中芦花荡的说课稿
  • 手机用什么软件可以更改视频格式及分辨率
  • 背包问题??7. 混合背包
  • redisson实现分布式锁实战
  • 男性心理禁区
  • 我们的一生吉他谱
  • 瘦脸瑜伽方法怎么做好
  • 游戏引擎发展史
  • ActiveMQ -- 中间件之运用(一)
  • 公司担保热门协议
  • 求职面试-HR会问你什么问题?
  • 3、Spring Cloud 服务消费者-初探Ribbon
  • 秀禾服大了可以改小吗 秀禾服上衣大了怎么办
  • 北京自然科技馆附近还有什么景点
  • 微信里的定位功能怎么设置
  • 前端框架选型调研报告
  • 图的一些基本知识:图,邻居,度矩阵,邻接矩阵
  • 粗胳膊减肥方法
  • 写给恩师的毕业留言
  • 儿童哲理小故事大全
  • Tri_integral Winter Training 0 比赛总结
  • 八年级下学期历史期中测试卷
  • 广电网络分公司年度工作总结
  • 主持人汪涵口才救场
  • java B2B2C Springcloud多租户电子商城系统-Zuul过滤器详解
  • 永恒的初恋散文
  • 我和四个汉字的趣事作文
  • 爱情段子伤感经典句子
  • 猜你喜欢

    电脑版