equals
我们知道equals()方法是定义在Object类中的,在没有被覆写时该方法与运算符==的作用是一样的。因为在 Object 类中equals()直接使用= =来实现。
值得注意的是 == 比较时用的是正真的地址。
那是不是我们要用时都需要覆写呢?其实也不是这样的,在一些标准类库中有的已经覆写好了可以直接使用,常见的有 file , integer , data , String类。
下面我们一起来学习吧!
public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
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) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
· 对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写
hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
参数:
obj
要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
此处只是为了实现equals方法的重写,就不对hashcode方法的重写。
那怎样实现呢?
Students类
package it.itcost; public class Students { //学生的姓名 private String name; //学生的学号 private int id; //学生的成绩 private double grade; Students(String name,int id,double grade){//三个参数的构造函数,用于给属性初始化 this.name = name; this.id = id; this.grade = grade; } //重写object的equals方法 //形参用object类型,有利于在继承了同一个父类的子类对象可以使用该方法 public boolean equals(Object obj){//显示参数名为obj //检测this与obj是否引用同一个对象 if(this == obj) return true; //检测odj是否为null,如果为空则返回false if(obj == null) return false; //比较this与odj是否属于同一个类如果equals的语义在每一个类中有所改变,就使用getClass检测 if(this.getClass().getName() != obj.getClass().getName()) return false; // //如果所有的子类都有统一的语义,就使用instanceof检测 // //instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。 // if(!(obj instanceof Students)) // return false; //通过以上的判断我们知道了Students的对象以及传给obj的对象不为null //对obj向下造型 Students other = (Students)obj; //测试对象的各属性的值是否相等 return name.equals(other.name) //name是String类型是引用类型并且覆写了equals方法,可以通过调用String类的equals来比较 &&this.id==other.id //id是基本类型直接使用==比较值是否相等 &&this.grade==other.grade; //grade是基本类型直接使用==比较值是否相等 } }
下面是测试代码
package it.itcost; public class StudentsTest { public static void main(String[] args) { Students Stu0 = new Students("柒间",20182206,90.00); Students Stu1 = new Students("柒间",20182206,90.00); Students Stu = new Students("Tom",20180000,80.00); //Stu1---Stu0 System.out.println((Stu1.equals(Stu0))); //Stu---Stu0 System.out.println((Stu.equals(Stu0))); } }
上面代码自己手写的如有改进的地方欢迎留言一起学习!