hashCode与equals

来源:互联网 发布:淘宝网音乐芯片 编辑:程序博客网 时间:2024/06/08 08:48

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


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 全世界华南虎的数量 真假华南虎 世界濒危华南虎 华南虎吧 华博美容整形医院 华博特教育 北京华博医院怎么样 华博医院地址 华博医疗美容医院 华博数码科技 华博特 华博特学历教育靠谱吗 华友源儿童内衣 华友源 华友源内衣 华君武 锦梅馨苑 金榜家园 剑桥景苑 普乐二村 华商论坛 华商价值 华商国际 华商策略 华商红利 华商集团 华商报 华商报电子版 华商报电话 华商报登报电话 西安华商报招聘信息 西安华商报 华商领先 华商学院 华商 普华商学院 华商银行 华商基金 广州华商 华商金地 广州华商职业学院