软件构造笔记(三)


前言:在很多场景下,需要判定两个对象是否“相等”,本文主要讨论==和equals的区别。

一.引用等价性 ==

对基本数据类型,使用==判定相等

二.对象等价性 equals

1.对对象类型,使用equals判定相等
2.equals的实现:

public class Object{
	...
	public boolean equals(Object that){
		return this == that;  //在对象等价性的判断是用引用等价性实现的
	}
}

一般来说,这个equals的实现通常不是程序员所期待的,所以一般需要重写

3.错误示例:

public class Duration{
	...
	public boolean equals(Duration that){
		return this.getLength() == that.getLength()
	}
}

Duration d1 = new Duration(1, 2);
Duration d2 = new Duration(1, 2);
Object o2 = d2;
d1.equals(d2);  //结果为true
d1.equals(o2);  //结果为false

d2是Duration类型,所以传入参数时实现的是Duration中的equals,即判断长度相等,所以结果为true;而o2是Object类型,所以传入参数时实现的是Object中的equals,即通过引用等价性进行判断,由于d1和o2是两个不同的对象,所以结果为false.

!!原因是上面equals的实现并不是重写,而是重载,因为改变了参数的类型。

4.重写equals的方法

@Override
public boolwan equals(Object that){
	return that instanceof Duration && this.sameValue((Duration)that);
}
private boolean sameValue(Duration that){
	return this.getLength == that.getLength();
}

5.对于可变类型的等价性
实现行为等价性即可,而且无需重写equals和hashcode两个函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值