Object的equals(即未重写的equals)的实现:
public boolean equals(Object obj) {
return this == obj;
//Object的equals实现,对于非空引用this和obj,当且仅当他们引用同一个对象时,此方法才返回true,因为引用数据类型“==”比较的是地址,只有二者引用同一个对象,地址才会相同。
}
boolean equals = x.equals(y){
return x == y;
//对于任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才
返回true值。
以上是直接比较对象的规则,如果直接比较两个对象的属性值,只要二者属性值相等,就会返回true
public class Student {
String name;
Integer gender;
int age;
}
class Teacher {
String name;
Integer gender;
int age;
}
package equals;
public class Test {
public static void main(String[] args) {
Student s = new Student("小明",0,20);
Student s1 = new Student("小明",0,20);
boolean equals = s.equals(s);
System.out.println(equals);//返回值为true;
boolean equals1 = s.equals(s1);
System.out.println(equals);//返回值为false;
boolean equals2 = s.name.equals(s1.name);
System.out.println(equals);//返回值为true;
boolean equals3 = s.gender.equals(s1gender);
System.out.println(equals);//返回值为true;
//注:equals只能比较引用数据类型,不能比较基本数据类型,否则会报错!
基本数据类型直接用“==”进行比较。
boolean equals4 = s.age.equals(s1.age);
System.out.println(equals);//age是基本数据类型,故报错;
}
}
对于重写的equals的实现: 为什么要重写:我们可以自定义比较两个对象相等的条件
//在类Student中对equals进行重写
public boolean equals(Object obj) {
//首先有一个判断的标志,将其初始值定义为false
boolean flag = false;
//然后判断传过来的对象是否是与比较对象的类相同,如果相同,将其
父类引用转回子类引用,如果不同则无比较的意义
if (obj instanceof Student) {
Student stu = (Student) obj;
if (this.age == stu.age && this.gender.equals
(stu.gender) && this.name != null && stu.name !=
null && this.name.equals(stu.name)) {
flag = true;
}
}
return flag;
}
public static void main(String[] args) {
Student s3 = new Student("小明",0,20);
Student s4 = new Student("小明",0,20);
Teacher t = new Teacher("小明",0,20);
boolean equals = s3.equals(s4);
boolean b = t.equals(s3);
System.out.println(equals);//true
System.out.println(b);false
不同类的对象也可以用equals 未重写的equals直接报false,因为两个引用指向的并不是同一个对象。 对于重写的equals完全可以比较不同类的对象,只需修改instanceof。
public boolean equals(Object obj) {
boolean flag = false;/
//首先有一个判断的标志,将其初始值定义为false
//然后判断传过来的对象是否是与比较对象的类相同,如果相同
,将其父类引用转回子类引用
if (obj instanceof Teacher) {
Teacher stu = (Teacher) obj;
if (this.age == stu.age && this.gender.equals
(stu.gender) && this.name != null && stu.name !=
null && this.name.equals(stu.name)) {
flag = true;
}
}
return flag;
}
public static void main(String[] args) {
Student s3 = new Student("小明",0,20);
Student s4 = new Student("小明",0,20);
Teacher t = new Teacher("小明",0,20);
boolean equals = s3.equals(s4);
boolean b = s3.equals(t);
System.out.println(equals);//false
System.out.println(b);//true
}
注意:如果重写了equals,务必要重写hashcode,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
总结以下两种重写hashcode方法。
public class Student {
String name;
Integer gender;
int age;
//方法一
public int hashCode() {
int result = 18;
result = 35 * result + name.hashCode();//字符串类型格式
result = 35 * result + age;
result = 35 * result + gender();
return result;
}
//方法二
public int hashCode() {
return Objects.hash(name, age, gender);
}
新手总结,如有错误,欢迎指正。