(!?!在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()方法?!?!)】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;

    推荐阅读