Java中判断对象是否相等的equals方法使用教程资料文档格式.docx
《Java中判断对象是否相等的equals方法使用教程资料文档格式.docx》由会员分享,可在线阅读,更多相关《Java中判断对象是否相等的equals方法使用教程资料文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
不可能相等。
如果超类中的域相等,就比较子类中的实例域。
对于数组类型的域,可以使用静态的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。