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)));
}
}
上面代码自己手写的如有改进的地方欢迎留言一起学习!