html equls比较方法,编写高质量equals方法

什么是equals方法

指示其他某个对象是否与此对象相等,equals方法存在Object类中,我们编写的类继承Object,可以覆盖Object的equals方法来实现我们的逻辑,去判断两个对象是否相等。

Object类中的equals方法

一起来看看Object类中的源代码

69c5a8ac3fa60e0848d784a6dd461da6.pngpublic booleanequals(Object obj) {return (this ==obj);

}

69c5a8ac3fa60e0848d784a6dd461da6.png

我们可以观察到几点:

equals方法是public修饰的,外部类是可以访问的

equals方法的返回值boolean,true为两个对象相等,false为两个对象不等

参数类型为Object,是其子类都可以比较

方法体判断的是两者的引用是不是相等

实际上为什么要编写equals

在我们的实际的操作中,有下面的例子:

69c5a8ac3fa60e0848d784a6dd461da6.png@Testpublic voidwhyUseEquals() {

User user1= new User("xujianguo", 21);

User user2= new User("xujianguo", 21);

System.out.println(user1.equals(user2));

}

69c5a8ac3fa60e0848d784a6dd461da6.png

发user1和user2的name都是xujianguo,age都是21的,按照我们的逻辑是同一个人,都是如果没有重写equals方法,默认采用Object的equals方法的话,结果就是false的,所以我们必须实现equals来实现我们的逻辑。

高质量equals方法

1.使用instanceof操作符检查参数是否为正确的类型

因为equals的参数为Object,你的类是Person,但是这个参数很可能不是Person类型的,可能是User类型的,这样的话就不符合你的判断的,使用instanceof可以判断你的参数是否为正确的你要的处理的类型。

69c5a8ac3fa60e0848d784a6dd461da6.png@Overridepublic booleanequals(Object object) {if(!(object instanceofPerson)) {return false;

}else{//...

return true;

}

}

69c5a8ac3fa60e0848d784a6dd461da6.png

2.把参数转化为正确的类型

在前面进行了类型的判断后,就需要进行类型的转换,转换成需要的类型我们才能进行后续的操作。

69c5a8ac3fa60e0848d784a6dd461da6.png@Overridepublic booleanequals(Object object) {if(!(object instanceofPerson)) {return false;

}else{

Person person=(Person)object;//...

return true;

}

}

69c5a8ac3fa60e0848d784a6dd461da6.png

3.匹配参数中的域情况

这里就是你的逻辑的实现,你的两个对象要怎么样才相等,对于我的这个Person类来说,name一样并且age一样,两个就相等了。

69c5a8ac3fa60e0848d784a6dd461da6.png@Overridepublic booleanequals(Object object) {if(!(object instanceofPerson)) {return false;

}else{

Person person=(Person)object;if(person.getName().equals(name) && person.getAge() ==age) {return true;

}else{return true;

}

}

}

69c5a8ac3fa60e0848d784a6dd461da6.png

4.编写完成equals方法后,检查其三大特性:自反性、对称性、传递性

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

对称性:对于任何非空引用值x、y,当x.equals(y)返回true的时候,y.equals(x)也返回true

传递性:对于任何非空引用值x、y、z,当x.equals(y)并且y.equals(z)都返回true的时候,有x.equals(z)返回true

高质量的equals方法必须满足这三大特性

原文:http://www.cnblogs.com/rayguo/p/3777692.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值