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属性,其余的类型保持不变。


posted @ 2017-12-25 21:06  妖君你好  阅读(68)  评论(0编辑  收藏  举报