equals() ,hashcode() 使用

来源:互联网 发布:淘宝代码生成器 编辑:程序博客网 时间:2024/05/19 03:41

原文 Java equals() and hashCode() Contract

java-hashcode

在java父类Object中定义了2个重要的方法

public boolean equals(Object obj)public int hashCode()

理解这两个方法非常重要,尤其是用户自定义的类型用在Map中作key,然而,即使高级开发者有时也无法正确使用它们。下面通过一个常见的错误作例子来说明它们是如何工作的。


1,常见错误

import java.util.HashMap; public class Apple {private String color; public Apple(String color) {this.color = color;} public boolean equals(Object obj) {if (!(obj instanceof Apple))return false;if (obj == this)return true;return this.color.equals(((Apple) obj).color);} public static void main(String[] args) {Apple a1 = new Apple("green");Apple a2 = new Apple("red"); //hashMap stores apple type and its quantityHashMap<Apple, Integer> m = new HashMap<Apple, Integer>();m.put(a1, 10);m.put(a2, 20);System.out.println(m.get(new Apple("green")));}}

在该例中,一个green apple object已添加到HashMap中,当要从中取出该对象对应的value时,该对象却没有被找到。上面的程序返回的是null。


2,由hashCode()导致的问题


问题是由于没有重写hashCode()方法导致的,equaels()和hashCode()的关系是这样的:

1),如果2个对象的相同的,那它们的hashCode一定相同

2),如果2个对象的hashCode相同,那它们可能相同也可能不相同


使用Map的本意是为了比线性查找更快的找到一个对象。用hashcode定位一个对象分2步。在Map内部存储对象用了一个二维数组,第一维数组的index即是key的hashcode值,用该index定位到第二维数组,在第二维数组中用equaels()方法线性查找是否存在某对象。


Object中hashCode()的默认实现是不同对象返回不同的integer值,上面例子中即使是同样类型,不同对象的hashcode也不同。


hashcode就像是用于存储一系列的仓库,不同的物品存放在不同的仓库中,如果可以将同一仓库中的不同物品分配一个唯一的位置,那就更有效率了。所以,正确分发hashcode值更重要。


上例的解决方案即是重写hashCode(),这里用String的长度作演示。

public int hashCode(){return this.color.length();}




参考文档1


---------------2015.5.10-----------------

另一篇文章Java hashCode() 和 equals()的若干问题解答对equals和hashCode讲解得更清楚

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子上学有兰山户口没有房产怎么办 培训机构跑路了怎么办 报的培训班跑路怎么办 巡视组举报后会怎么办 巡视组交办不办怎么办 分手以后还要不要联系忘不了怎么办 父母穷且不上进怎么办 惹父母生气了该怎么办 小孩戒奶不吃奶粉怎么办 孩子听不进去话怎么办 异性好朋友喜欢自己亲吻自己怎么办 对方对你反感了怎么办 家长偷看孩子日记老师怎么办 儿子与父母相冲怎么办 初二孩子不争气老师打他怎么办? 孩子被老师打又怎么办 家里2个孩子打架怎么办 一年级的学生特别会顶嘴怎么办 私立学校的学生顶嘴老师该怎么办 孩子做错事家长不道歉怎么办 孩孑语文成绩差怎么办 高三了孩子不愿意补课怎么办 四年级的孩子上课喜欢讲小话怎么办 五年级孩子太叛逆怎么办 二年级话唠孩子怎么办 家有老人带孩子怎么办 不会看孩子。孩子一哭就害怕怎么办 孩子不老实爱动怎么办 4周孩子脾气大怎么办 老公脾气暴躁爱骂人怎么办? 当妈妈了脾气不好怎么办 父亲很坏不顾家很会赌钱怎么办 妈妈骂我很难听怎么办 父母管的太严怎么办 2岁宝宝哭闹不止怎么办 8岁儿童叛逆期怎么办 两岁宝宝叛逆期怎么办 4个月小孩哭怎么办 2个月孩子爱哭怎么办 小孩挑衅大人被大人打怎么办 在学校犯了错怎么办