hashCode()方法的作用【附】

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()方法去对比也行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值