Java中判断对象是否相等的equals方法使用教程资料文档格式.docx

上传人:b****3 文档编号:18431850 上传时间:2022-12-16 格式:DOCX 页数:19 大小:23.97KB
下载 相关 举报
Java中判断对象是否相等的equals方法使用教程资料文档格式.docx_第1页
第1页 / 共19页
Java中判断对象是否相等的equals方法使用教程资料文档格式.docx_第2页
第2页 / 共19页
Java中判断对象是否相等的equals方法使用教程资料文档格式.docx_第3页
第3页 / 共19页
Java中判断对象是否相等的equals方法使用教程资料文档格式.docx_第4页
第4页 / 共19页
Java中判断对象是否相等的equals方法使用教程资料文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

Java中判断对象是否相等的equals方法使用教程资料文档格式.docx

《Java中判断对象是否相等的equals方法使用教程资料文档格式.docx》由会员分享,可在线阅读,更多相关《Java中判断对象是否相等的equals方法使用教程资料文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

Java中判断对象是否相等的equals方法使用教程资料文档格式.docx

不可能相等。

如果超类中的域相等,就比较子类中的实例域。

对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的元素是否相等。

来看几个字符串比较例子:

Stringa="

abc"

;

2

Stringb="

3

Stringc=newString("

);

4

Stringd=newString("

5

System.out.println(a==b);

//true因为JAVA中字符串常量是共享的,只有一个拷贝

6

〔System.out.println(a--c);

//falsea和c属于2个不冋的对象1

7System.out.println(a.equals(c));

//true由于String对象的equals方法比较的是对象中的值,

8所以返回true。

(和Object的equals方法不同)

9System.out.println(c==d);

//falsec和d虽然对象内的值相同,但属于2个不同的对象,所

以不相等

System.out.println(c.equals(d));

//true

简单的说,当比较字符串常量时,等于和equals返回的结果一样,当想比较字符串对象的值时用equals。

看一个equals的使用例子:

packagechapterO5.EqualsTest;

importjava.util.*;

publicclassEqualsTest{

publicstaticvoidmain(String[]args){

Employeealice1=newEmployee("

AliceAdams"

75000,1987,12,15);

Employeealice2=alice1;

//referencethesameobject

7

Employeealice3=newEmployee("

8

Employeebob=newEmployee("

BobBrandson"

50000,1989,10,1);

9

System.out.println("

alice1==alice2:

"

+(alice1==alice2));

10

alice1==alice3:

+(alice1==alice3));

11

System.out.println("

alice1.equals(alice3):

+(alice1.equals(alice3)));

12

alice1.equals(bob):

+(alice1.equals(bob)));

13

System.out.println(bob.toString());

14

}

15

16

classEmployee{

17

publicEmployee(Stringn,doubles,intyear,intmonth,intday){

18

name=n;

19

salary=s;

20

GregorianCalendarcalendar=newGregorianCalendar(year,month,day);

21

hireDay=calendar.getTime();

22

23

publicStringgetName(){

24

returnname;

25

26

publicdoublegetSalary(){

27

returnsalary;

28

29

publicDategetHireDay(){

30

returnhireDay;

31

32

publicvoidraiseSalary(doublebyPercent){

33

doubleraise=salary*byPercent/100;

34

salary+=raise;

35

}

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

publicbooleanequals(ObjectotherObject){

//aquicktesttoseeiftheobjectsareidenticalif(this==otherObject)returntrue;

//mustreturnfalseiftheexplicitparameterisnull

if(otherObject==null)returnfalse;

//iftheclasseddon'

tmatch,theycan'

tbeequal

if(getClass()!

=otherObject.getClass())returnfalse;

//nowweknowotherObjectisawww.hunanwang.netyeeEmployeeother=(Employee)otherObject;

//testwhetherthefieldshavaidenticalvaluesreturnname.equals(other.name)&

salary==other.salary

hireDay.equals(other.hireDay);

@Override

publicinthashCode(){

return7*name.hashCode()+11*newDouble(salary).hashCode()+13*hireDay.hashCode();

publicStringtoString(){

returngetClass().getName()+"

[name="

+name+"

salary="

+salary

+"

hireDay="

+hireDay+"

]"

privateStringname;

privatedoublesalary;

privateDatehireDay;

classManagerextendsEmployee{

publicManager(Stringn,doubles,intyear,intmonth,intday){

super(n,s,year,month,day);

bouns=0;

doublebaseSalary=super.getSalary();

returnbaseSalary+bouns;

publicvoidsetBouns(doubleb){

bouns=b;

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

if(!

super.equals(otherObject))

returnfalse;

Managerother=(Manager)otherObject;

//superequalscheckedthatthisandotherbelongtothesameclassreturnbouns==other.bouns;

returnsuper.hashCode()+17*newDouble(bouns).hashCode();

returnsuper.toString()+"

[bouns="

+bouns+"

privatedoublebouns;

深入

下面根据"

类是否覆盖equals。

方法”,将它分为2类。

(1)若某个类没有覆盖equals。

方法,当它的通过equals。

比较两个对象时,实际上是比较两个对象是不是同一个对象。

这时,等价于通过"

==”去比较这两个对象。

⑵我们可以覆盖类的equals。

方法,来让equals。

通过其它方式比较两个对象是否相等。

通常的做法是:

若两个对象的内容相等,则equals。

方法返回true;

否则,返回fasle。

下面,举例对上面的2种情况进行说明。

1."

没有覆盖equals()方法”的情况

代码如下(EqualsTestl.java):

importjava.Iang.Comparable;

/**

*@descequals()的测试程序。

*/

publicclassEqualsTest1{

publicain(String[]args){

//新建2个相同内容的Person对象,

//再用equals比较它们是否相等

Personp1=newPerson("

eee"

100);

Personp2=newPerson("

System.out.printf("

%s\n"

p1.equals(p2));

*@descPerson类。

privatestaticclassPerson{

intage;

Stringname;

publicPerson(Stringname,intage){

this.name=name;

this.age=age;

returnname+"

-"

+age;

运行结果:

复制代码代码如下

false

结果分析

我们通过p1.equals(p2)来"

比较pl和p2是否相等时”。

实际上,调用的Object.java的equals。

方法,即调用的(p仁=p2)。

它是比较“pl和p2是否是同一个对象”。

而由pl和p2的定义可知,它们虽然内容相同;

但它们是两个不同的对象!

因此,返回结

false。

36

2."

覆盖equals。

方法”的情况

我们修改上面的EqualsTest1.java:

方法。

代码如下(EqualsTest2.java):

publicclassEqualsTest2{

}

publicPerson(Stringname,intage){this.name=name;

*@desc覆盖equals方法

publicbooleanequals(Objectobj){if(obj==null){returnfalse;

//如果是同一个对象返回true,反之返回

if(this==obj){

returntrue;

〃判断是否类型相同

if(this.getClass()!

=obj.getClass()){returnfalse;

Personperson=(Person)obj;

returnname.equals(person.name)&

age==person.age;

true

结果分析:

我们在EqualsTest2.java中重写了Person的equals()函数:

当两个Person对象的name和age都相等,则返回true。

因此,运行结果返回true。

讲到这里,顺便说一下java对equals()的要求。

有以下几点:

对称性:

如果x.equals(y)返回是"

true"

,那么y.equals(x)也应该返回是"

反射性:

x.equals(x)必须返回是"

类推性:

,而且y.equals(z)返回是"

,那么z.equals(x)也应该返回是"

一致性:

,只要x和y内容一直不变,不管你重复x.equals(y)

多少次,返回都是"

非空性,x.equals(null),永远返回是"

false"

;

x.equals(和x不同类型的对象)永远返回是"

现在,再回顾一下equals()的作用:

判断两个对象是否相等。

当我们重写equals()的时候,可

千万不好将它的作用给改变了!

equals()与==的区别是什么?

==:

它的作用是判断两个对象的地址是不是相等。

即,判断两个对象是不是同一个对象。

equals():

它的作用也是判断两个对象是否相等。

但它一般有两种使用情况(前面第1部分已

详细介绍过):

情况1,类没有覆盖equals()方法。

则通过equals()比较该类的两个对象时,等价于通过“==”

比较这两个对象。

情况2,类覆盖了equals()方法。

一般,我们都覆盖equals()方法来两个对象的内容相等;

它们的内容相等,则返回true(即,认为这两个对象相等)。

下面,通过示例比较它们的区别。

代码如下:

*@descequals。

的测试程序。

publicclassEqualsTest3{

System.out.printf("

p1.equals(p2):

%s\n"

p1==p2:

p1==p2);

publicbooleanequals(Objectobj){

if(obj==null){

//如果是同一个对象返回true,反之返回false

运行结果:

1p1.equals(p2):

true

2p1==p2:

false

在EqualsTest3.java中:

(1)p1.equals(p2)

这是判断p1和p2的内容是否相等。

因为Person覆盖equals()方法,而这个equals()是用来

判断p1和p2的内容是否相等,恰恰p1和p2的内容又相等;

因此,返回true。

⑵p1==p2

这是判断p1和p2是否是同一个对象。

由于它们是各自新建的两个Person对象;

因此,返

回false。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1