hashCode与=怎么在java中使用

  

hashCode与=怎么在java中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强> 1,为什么要用hashCode() ?

集合中设置的元素是无序且不可重复的,那判断两个元素是否重复的依据是什么呢?

有人说:比较对象是否相等当然用<代码> Object.equal() 了。但是,设置中存在大量对象,后添加到集合中设置的对象元素比较次数会逐渐增多,大大降低了程序运行效率。java中采用哈希算法(也叫散列算法)来解决这个问题,将对象(或数据)依特定算法直接映射到一个地址上,对象的存取效率大大提高。

这样一来,当含有海量元素的集合设置需要添加某元素(对象)时,先调用这个元素的hashCode(),就能一下子定位到此元素实际存储位置,如果这个位置没有元素,说明此对象是第一次存储到集合,直接将此对象存储在此位置上,若此位置有对象存在,调用等于()看看这两个对象是否相等,相等就舍弃此元素不存,不等则散列到其他地址。

这也是为什么设置集合存储对象类型数据的时候,要不仅仅重写对象的hashCode()方法还要重写=()方法的原因。

<强> 2,如何使用hashCode() ?

<强> hashCode()的返回值和equals()的关系

<李>

如果a.equals (b)返回“真正的”,那么a和b的hashCode()一定相等。

<李>

如果a.equals (b)返回“false”,那么a和b的hashCode()有可能相等,也有可能不等。

下面是一个例子。在实际的软件开发中,最好重写这两个方法。

public  class  Employee  {   ,int  employeeId;   ,String 名称;   ,@Override   ,public  boolean  equals (Object  obj)   ,{   如果才能(obj==)   ,,return 真实;   Employee 才能;emp=(员工)obj;   如果才能(employeeId.equals (emp.getEmployeeId()),,,,的名字==emp.getName ())   ,,return 真实;   return 才能;假;   ,}   ,@Override   ,public  int  hashCode (), {   int 才能;hash =, 1;   时间=hash 才能;hash  *, 17, +, employeeId;   时间=hash 才能;hash  *, 31, +, name.hashCode ();   return 才能,散列;   ,}   }

equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复。

这里我们首先要明白一个问题:

equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashCode()有可能相等。

在这里hashCode就好比字典里每个字的索引,equals()好比比较的是字典里同一个字下的不同词语。就好像在字典里查“自”这个字下的两个词语“自己”、“自发”,如果用equals()判断查询的词语相等那么就是同一个词语,比如equals()比较的两个词语都是“自己”,那么此时hashCode()方法得到的值也肯定相等;如果用equals()方法比较的是“自己”和“自发”这两个词语,那么得到结果是不想等,但是这两个词都属于“自”这个字下的词语所以在查索引时相同,即:hashCode()相同。如果用equals()比较的是“自己”和“他们”这两个词语的话那么得到的结果也是不同的,此时hashCode() 得到也是不同的。

反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。

在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode() 也就相等了。

既然equals比较元素相等更准确,那么为什么还要用hashCode( )方法呢?

因为hash算法对于查找元素提供了很高的效率,如果想查找一个集合中是否包含有某个对象,大概的程序代码怎样写呢?
你通常是逐一取出每个元素与要查找的对象进行比较,当发现某个元素与要查找的对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则,返回否定的信息,如果一个集合中有很多个元素,比如有一万个元素,并且没有包含要查找的对象时,则意味着你的程序需要从集合中取出一万个元素进行逐一比较才能得到结论。

hashCode与=怎么在java中使用