深入java的equals方法怎么比较两个对象的
当定义一个类时,首先这个类会继承object类(所有类的父类)的equals方法,然后开发者可以根据具体业务场景去考虑要不要重写equals方法。
1
2
3
publicbooleanequals(objectobj){
return(this==obj);
}
上面代码即是object的equals方法的实现, == 判断,即两个对象的地址完全一样的时候才相等。
当开发者定义类时不重写equals方法,则实际调用中使用object这个父类的equals方法实现。
下面看看string的equals方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
publicbooleanequals(objectanobject){
if(this==anobject){
returntrue;
}
if(anobjectinstanceofstring){
stringanotherstring=(string)anobject;
intn=value.length;
if(n==anotherstring.value.length){
charv1[]=value;
charv2[]=anotherstring.value;
inti=0;
while(n--!=0){
if(v1[i]!=v2[i])
returnfalse;
i++;
}
returntrue;
}
}
returnfalse;
}
这就是string重写的equals方法,可以仔细看看,很有参考价值。
接下来写段类定义的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
publicclassPerson{
privatestringname;//姓名
privateintage;//年龄
privatestringspeciality;//特长
@override
publicbooleanequals(objectobj){
//两个对象是同一个时,直接returntrue
if(this==obj){
returntrue;
}
if(objinstanceofPerson){
//比较对象也是Person对象时,判断name和age是否都相同
Personp=(Person)obj;
returnname.equals(p.name)&&age==p.age;
}
returnfalse;
}
publicstringgetname(){
returnname;
}
publicvoidsetname(stringname){
this.name=name;
}
publicintgetage(){
returnage;
}
publicvoidsetage(intage){
this.age=age;
}
publicstringgetspeciality(){
returnspeciality;
}
publicvoidsetspeciality(stringspeciality){
this.speciality=speciality;
}
}
测试代码:
1
2
3
4
5
6
7
8
9
publicclasstest{
publicstaticvoidmain(string[]args)throwsioexception{
Personp1=newPerson("张三",20,"java");
Personp2=newPerson("张三",20,"python");
system.out.println(p1.equals(p2));
}
}
根据Person重写的equals方法可以知道,运行结果为 true
如果Person没有重写equals方法,那么会调用object的equals方法,运行结果为 false
所以实际怎么比较两个对象这完全是看开发者也就是你自己的意思