1. hashCode() 方法和equals()方法的作用其实是一样的,在java中都是用来对比两个对象是否相等、一致;
2. 既然作用相同,为什么要定义两个作用相同的方法呢?二者的区别是什么?
因为重写的equals()方法比较的较为全面、较为复杂,以至于处理效率就相对比较低;
而利用hashCode()方法进行比较,则只要生成一个hash值进行比较就可以了,处理效率很高;
3. 既然hashCode()方法效率很高,为什么还要有equals()方法?
因为hashCode()方法并不是完全可靠的,有时候不同的对象它们生成的hashCode值也会一样。
所以,hashCode()只能说是大部分时候可靠,并不是绝对的可靠!!!
因此,我们可以得出:
※※ equals()相等的两个对象,它们的hashCode()的值肯定相等!也就是说,用equals()方法进行对比是绝对可靠的;
※※ hashCode()相等的两个对象,它们的equals()的结果不一定相同!也就是说。hashCode()方法不是绝对可靠的;
所有对于需要大量并且快速的对比的话,若都用equals()去做显然效率太低,所以解决方式是:每当需要对比的时候,首先用hashCode()方法去进行比较,若hashCode()不一样时,则表示两个对象肯定不相等(也就不必再用equals()方法再比对了);若hashCode()方法相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高效率,页保证了对比的绝对正确性。
这种大量、并且快速的对象对比一般使用在hash容器中,如:hashSet、hashMap、hashTable等。
比如hashSet中要求对象不能重复,则它内部必然要对添加进去的每个对象进行对比,而它的对比规则就是像上面说的那样,先hashCode(),若对比结果不同,再用equals()进行验证;若hashCode()方法对比结果为不同,则肯定不同,这样对比的效率就很高了。
然而hashCode()和equals()一样都是基本类Object里面的方法,而和equals()方法一样,Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同,所以这显然不是我们想要的,所以我们必须重写我们类的hashCode()方法,即一个类,在hashCode()方法里面返回唯一的一个hash值。比如如下类:
public class Person {
private String name;
private String address;
private Integer age;
@Override
public int hashCode() {
return name.hashCode()*address.hashCode()*age.hashCode();
}
}
由于标识这个类的是它的内部的变量name、address和age,所以我们就根据它们返回的一个hash值作为这个类的唯一hash值。
所以若我们的对象想要放进hashSet,并且发挥hashSet的特性(即,不包含一样的对象),则我们就要重写我们类的hashCode()方法和equals()方法了。像String、Integer等这种类,内部都已经重写这两个方法。
当然,如果我们只是平时想对比两个对象是否一致,则只重写一个equals(),然后利用equals()方法去对比也行。