2021-06-15

重写Object方法——equals、hashCode

Object类中的equals和hashCode
Object类中的equals和hashCode是我们默认使用的方法。java中判断两个对象相等时有如下规则:
1)判断两个对象的hashCode是否相等
如果不相等,认为两个对象不相等
2)如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象不相等
如果相等,认为两个对象相等
在Object类中,equals方法判断两个引用是否指向同一对象,其与运算符"=="类似,然而很多类中都需要重写equals和hashCode方法,以产生新的定义。接下来以Lab2中的Edge类为例,说明下重写equals、hashCode方法的目的和作用。
重写equals方法
Edge < L >类属性如下:

private L source, target;
private int weight;

其包含一个起点,一个终点,一个边的权值。我们要判断两条edge相等时,只需在属性都非空的情况下判断起点、终点、权值分别相等即可。对此我们可以进行如下重写:

@Override
    public boolean equals(Object obj)
    {
    	if(!(obj instanceof Edge))
    	{
    	       return false;
    	}
    	if(getClass()!=obj.getClass())
    	{
    		return false;
    	}
    	Edge<L> edObj = (Edge<L>) obj;
    	if(this == edObj)
    	{
    		return true;
    	}
    	
    	if(edObj.source.equals(this.source)&&edObj.target.equals(this.target)&& edObj.weight == this.weight)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }

instanceof是一个双目运算符,用来判断obj 为 Edge 的对象,或者是其直接或间接子类,或者是其接口的实现类,否则返回false; getClass() 方法用于获取对象运行时对象的类。接下来将obj转换为Edge泛型,this==edObj说明地址相等,返回true;地址不等时若起点、终点、权重等属性相等也返回true,否则返回false.
重写hashCode方法
如果你重写了equals方法,那么一定要记得重写hashCode()方法,因为hashCode方法是为哈希表服务的,当我们在使用形如HashMap, HashSet这样前面以Hash开头的集合类时,hashCode就会被隐式调用以来创建哈希映射关系。
重写hashCode如下:

@Override
    public int hashCode()
    {
    	int result = 17;
    	result = 31*result + (source == null ? 0 : source.hashCode());
    	result = 31*result + (target == null ? 0 : target.hashCode());
    	return result;
    }

首先定义一个初始值,一般来说取17

int result = 17;

接下来对于涉及计算的各个属性将其依次应用于下式:

result = result * 31 + (XXXX == null? 0 : XXXX.hashCode());  //XXXX为类的属性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值