(!?!在Java中重写equals()方法?!?!)
为什么要重写equals()方法? 因为继承Objec的equals方法只能判断两个对象是否是同一个对象。可是我们认为常用的equals方法应该具有逻辑判断功能,所以我们重写equals方法,可以按照我们所需的要求自定义。
Object中equals方法 Object中的equals方法用于检测一个对象是否等于另外一个对象. Object类中,判断两个对象是否引用同一个对象实现equals方法,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
实际处理中,若要比较两个对象是否相等,一般需要重写equals方法.
equals()与==的区别
- ==比较基本数据类型,比较的是值
- ==比较引用数据类型,比较的是地址
- equals()本身也比较地址,因为在equals()方法中,直接return的就是 this == obj
- 但是因为String类对equals()方法进行了重写,所以可以比较内容
package Test1;
/**
* 重写toString方法
*/
public class Person {
private String name;
//名字
private String idCard;
//身份证号public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getIdCard() {
return idCard;
}public void setIdCard(String idCard) {
this.idCard = idCard;
}public Person(String name, String idCard) {
this.name = name;
this.idCard = idCard;
}public Person() {}@Override
public boolean equals(Object obj) {
if (this == obj) {//先进行一个判断当前对象 this 和 传进来的 obj 进行比较
return true;
}
if (obj instanceof Person) { //比较当前对象是属于我们要比较的Person类型的 ,才可以进行强转
Person p = (Person)obj;
//强制类型转换
//父类Object类中不含getName()方法,所以需要强转,转为子类对象
if(this.getName().equals(p.getName()) && this.getIdCard().equals(p.getIdCard())) {
return true;
}
} else {
System.out.println("不要瞎传对象");
}
return false;
}
public static void main(String[] args) {
// equals 方法
// == 比较基本数据类型 比较的是值 比较引用数据类型 比较的是内存中的地址
// equals方法本身也是比较的地址 因为equals方法中 直接return 的 就是this == obj
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1 == p2);
//对象中不含值,如果此句不注释,会报空指针异常
//System.out.println(p1.equals(p2));
System.out.println("=========我是分隔符========");
// 我们通过new关键字创建出来的对象 地址的都不一样的
// 我们通过==比较两个对象 地址肯定是不一样的
// 我们现实生活中会有一些这样的需求比如 两个人名字 身份证号都相同
// 这种情况 我们要使用equals来比较 输出为true
Person p3 = new Person("赵四" , "41023459578");
Person p4 = new Person("赵四" , "41023459578");
System.out.println(p3.equals(p4));
System.out.println("=========我是分隔符========");
Person p5 = new Person("广坤" , "4101234");
Person p6 = new Person("广坤" , "41022356");
System.out.println(p5.equals(p6));
}
}
输出结果为:
文章图片
java规范中对equals方法的约束 【(!?!在Java中重写equals()方法?!?!)】java规范中equals方法特征
自反性 | 对于任何非空引用x, x.equals(x) 返回true; |
---|---|
对称性 | 对于任何引用x, y, 当且仅当y.equals(x) 返回true, x.equals(y)返回true; |
传递性 | 对于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 则 x.equals(z)返回true; |
一致性 | 若x和y引用的对象没有发生改变, 则反复调用x.equals(y)应该返回同样的结果. |
- 对任意非空引用x, x.equals(null) 返回false;
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 你到家了吗
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 闲杂“细雨”
- 杜月笙的口才
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 赢在人生六项精进二阶Day3复盘