重写equals方法

一、为什么要重写equals方法?

Object类是Java中所有类的基类,Object类中的equals方法实际比较的是两个对象的内存地址是否相等。如果两个引用指向同一个对象,则equals返回true,否则返回false

Object类中equals方法定义如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }

实际应用中,往往需要比较两个对象实际状态,所以需要重写equals方法

二、重写equals方法的相关约定

1)自反性:对于任何非空引用值x,x.equals(x)都应返回true

2)对称性:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true

3)传递性:对于任何非空引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么 x.equals(z) 应返回true

4)一致性:对于任何非空引用值x和y,多次调用x.equals(y)始终返回true或始终返回false,前提是对象上equals比较中所用的信息没有被修改

5)非空性:对于任何非空引用值x,x.equals(null)都应返回false

三、重写equals方法案例

public class People {
	private Integer id;
	private String name;

	@Override
	public boolean equals(Object obj) {
		// 如果为同一对象的不同引用,则返回true
		if (this == obj) {
			return true;
		}
		// 如果传入的对象为空,则返回false
		if (obj == null) {
			return false;
		}
		// 如果两者属于不同的类型,则返回false
//		if (getClass() != obj.getClass()) {
//			return false;
//		}
		if (!(obj instanceof People)) {
			return false;
		}
		People people = (People) obj;
		return Objects.equals(id, people.getId()) && Objects.equals(name, people.getName());
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

四、hashCode的通用约定

重写equals方法时总要重写hashCode

1)只要对象equals方法涉及到的关键域内容不改变,那么这个对象的hashCode总是返回相同的整数

2)如果两个对象的equals(Object obj)方法时相等的,那么调用这两个对象中的任意一个对象的hashCode方法必须产生相同的整数结果。如果两个对象equals方法不同,那么必定返回不同的hashCode整数结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邋遢的流浪剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值