zoukankan      html  css  js  c++  java
  • hashCode与equals

       文字来自《java特种本》

     equals()重写后,一般会重写hashCode()方法吗?


     hashCode()方法提供了对象的hashCode()值,他和equals一样在Object基类中提供。


    hashCode()方法返回的值是这个对象的头部的一部分二进制位组成的数字。这个数字具有一定的标识对象的意义存在,但是绝不等价于地址


    hashCode的作用-----他为了产生一个可以标识对象的数字,不论如何复杂的一个对象都可以用一个数字来标识。  为什么需要一个数字来标识对象呢?因为想将对象用在算法中,如果不这样,许多算法还得自己去组装数字,因为算法的基础是建立在数字基础之上的。


      那么对象如果用在算法中呢???

                        例如,在hashmap,hashset等类似的集合类中,如果用某个对象本身作为key,也就是要基于这个对象实现hash的写入和查找,那么对象本身如何能实现这个呢?就是基于这个数字来完成,只有数字才能真正的完成计算和对比操作。


        hashCode只能说是标识对象,因此在hash算法中可以将对象相对离散开,这样就可以在查找数据的时候根据这个key快速的缩小数据的范围。  但不能说hashCode值一定是唯一的,所以在hash算法中定位到具体的链表后,需要进一步循环链表,然后通过equals()方法来对比key是否一样。  这时候hashCode()和equals()似乎成了“天生一对” 。换言之,一个为了算法的快速定位数据而存在,一个为了对比真实值而存在。


         与equals()类似,hashCode()方法也可以重写,重写后的方法将决定他在hash相关数据结构中的分布情况,所以这个值最好是能够将对象相对离散的数据。

         如果发生一个极端情况,hashcode()始终返回一个值,那么他将存在于hashmap中的同一个链表中,将会比链表查询本身还要慢。



    ----------------------------------------------------------------------


    换个思路,hashcode()与equals()并不是强制在一起,如果不实用这样的算法,也未必要重写对应的方法,完全由你自己决定,没有语法的强制规定。

          

    ----------------------------------------------------------------


    tip---

         在jdk1.7中,在hash的相关集合类使用string作为key的情况时,不再使用hashcode方式,而是有了一个hash32属性,其余的类型保持不变。


  • 相关阅读:
    5.2 spring5源码--spring AOP源码分析三---切面源码分析
    5.2 spring5源码--spring AOP源码分析二--切面的配置方式
    在Dubbo中使用Zookeeper入门案例
    Dubbo直连方式改造
    Dubbo直连方式
    16.3.3 对矢量可执行的其它操作
    16.3.2 可对矢量(vector)执行的操作
    16.3 标准模板库
    16.2.2 有关智能指针的注意事项
    16.2.1 使用智能指针
  • 原文地址:https://www.cnblogs.com/fangyuandoit/p/13713897.html
Copyright © 2011-2022 走看看