深入java的equals方法怎么比较两个对象的

深入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

所以实际怎么比较两个对象这完全是看开发者也就是你自己的意思

首页