黑马程序员——关于HashSet的思考

                           ------- android培训java培训、期待与您交流! ----------     

           今天在看视频时,毕老师在讲解HashSet结构时,用的例子中讲到HashSet保证元素唯一性的手段
   是通过元素的两个方法,hashCode和equals来完成。
   如果元素的HashCode值相同,才会判断equals是否为true。

   在视频中 由于直接粘贴了前面的自定义equals方法:

public boolean equals(Object obj)
	{

		if(!(obj instanceof Person))
			return false;

		Person p = (Person)obj;
		System.out.println(this.name+"...equals.."+p.name);

		return this.name.equals(p.name) && this.age == p.age;
	}

 

所以在后面重写hashCode()后,比较的对象hash值相等,就调用上面equals()方法。

   于是我就想,如果没有这个重写的equals方法的话,那么调用的会是哪个方法呢,然后去查api文档

发现HashSet中没有equals()方法,但他继承了java.util.AbstractSet中的equals()方法,

比较指定对象与此 set 的相等性。如果给定对象也是一个 set,两个 set 的大小相等,并且给定 set 的每个成员都包含在此 set 中,则返回true。这确保equals 方法在 Set 接口的不同实现间正常工作。

此实现首先检查指定的对象是否是此 set;如果是,则返回 true。然后,它将检查指定的对象是否是一个大小与此 set 的大小相等的 set;如果不是,则返回 false。如果是,则返回containsAll((Collection) o)

    所以,即使没有那个重写的方法,HashSet中也有自己的equals()方法去判断hash值相同的对象。

但是明显这个方法并不能应对各种需求。因此,hashCode()和equals()方法在用到时一般都需要复写掉。

                          ------- android培训java培训、期待与您交流! ----------

                                    详细请查看:http://edu.csdn.net/heima/ 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值