hashset中hashcode和equals方法

equals和hashcode
在hashset中,加入元素先判断两个对象的hashcode是否相等,在判断equals是否相等,以为equals效率低,用hashcode判断可以减少equals的调用次数,增加效率。对象的equals方法如果没重写默认继承object,object中equals方法return ==,所以没重写的对象比较的是地址值,所以equals相等的对象hashcode一定相等,换句话说,先判断hashcode的值来判断两个对象是否相等,只有hashcode值相等的情况下才会判断equals是否相等,所以equals方法都判断相等了前提的hashcode一定相等,但是拥有相同的hashcode值的对象不一定是同一个对象,同理如果hashcode不想等那么一定不是同一个对象,当然equals不同的对象hashcode值也可能相同。
String重写了equals方法使得他们比较的是其中的内容是否相等,如果内容相等就返回true,这么做有什么用呢,在hashset中不允许存在重复的值,但是如果是new String(“1”)和new String(“1”)都放进去,如果不重写equals方法,那么默认继承object的equals方法,比较地址值是否相同,显然不同,但是在我们看来这两个对象明显存储的数据是相同的,违背了set集合不能存取重复元素的规则,所以这时候我们要重写equals方法,使得他们比较其值相同就认为是同一个对象来完成set集合中不能存储相同元素的功能,实现代码如下:
首先肯定先要重写hashcode方法,如果是hashset的话,以为效率嘛,前面说到过hashcode方法效率比equals方法高;
hashcode(){
return this.name*10;

然后当hashcode值相同时候进入equals真正的判断是否是同一个值
equals(Object obj){
首先是object中的判断
if(this==obj) return ture;
然后判断是否是不同的对象类型,因为类型不同其值肯定没有比较的意义,因为不是同一个对象,只有同一个对象才比较其值相同才能说明这个对象是同一个对象。
if(!this instanceof obj)或者if(this.class!=obj.class)return false;
最后就是当类型相同的时候比较对象中的值是否相等,由于传入过来的是obj类型首先转换为同一类型才能调用其中的方法来取其中的值
obj = (this.class)obj;
return this.name==obj.name&&this.age==obj.age;

这样就完成了比较两个对象的值相同就可以判断两个对象相同,适用于hashset集合中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值