在Java中每个类中除非声明继承某个类,否则默认继承Object类,今天就来说一下Object中一个常用的方法,equals方法
1.首先Java中equals方法比较的是两个引用的内存地址,其次Java中的equals方法设计的目的是:比较两个对象是否一样
2.首先先来看一段代码:
public class Test1 {
public static void main(String[] args){
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2));
}
}
这段程序的结果是false。因为两个对象都是在堆中创建的,内存地址是不一样的,所以结果是false。
3.再来看一段代码
public class Test1 {
public static void main(String[] args){
Star s1 = new Star(100, "黄晓明");
Star s2 = new Star(100, "黄晓明");
System.out.println(s1.equals(s2));
}
}
class Star{
int id;
String name;
public Star(int id,String name){
this.id = id;
this.name = name;
}
}
这段代码的结果也是false。按照之前的解释是没有错误的。但是按照业务逻辑是不符合逻辑的,只要id和name相同那就是同一个人,即使两个对象的内存地址不一样也不能影响我们的判断,
所以我们应该重写Object中的equals方法。
3.重写之后的代码
public class Test1 {
public static void main(String[] args){
Star s1 = new Star(100, "黄晓明");
Star s2 = new Star(100, "黄晓明");
System.out.println(s1.equals(s2));
}
}
class Star{
int id;
String name;
public Star(int id,String name){
this.id = id;
this.name = name;
}
//在现实的生活中Object中的equals方法不应该比较的是内存地址,而应该比较实际内容,所以Object中的equals应该重写
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj instanceof Star){
Star s = (Star)obj;
if(s.id==this.id && s.name.equals(name)){
return true;
}
}
return false;
}
}
重写之后的结果是:true。没有问题,符合逻辑。