equal

更新时间:2022-12-27 21:17:00 阅读: 评论:0


2022年12月27日发(作者:酸的化学性质)

Java中equals()⽅法实例详解

⽬录

equals()在哪⾥

Java中重写的equals()

在Java中⽐较的推荐⽅法

为什么要在我们⾃⼰的类中重写equals()

重写equals()的规范

重写equals()可能的误区

⼀般的equals()写法

附:java中equals()⽅法的正确使⽤

总结

equals()在哪⾥

⾸先我们知道Java中Object类是所有类的⽗类,它⾥⾯定义了equals()⽅法:

publicbooleanequals(Objectobj){

return(this==obj);

}

可以看到是使⽤==来进⾏⽐较的,那么==是什么意思呢?其实是⽐较两个对象的的内存地址。(这⾥顺便提⼀下,可以去了

解⼀下Java的堆栈。)

=》若(object2)为true,则表⽰equals1和equals2实际上是引⽤同⼀个对象。

Java中重写的equals()

这⾥我们看⼀下java的⼀些⾃带的包装类怎么重写equals()的:

publicbooleanequals(ObjectanObject){

if(this==anObject){

returntrue;

}

if(anObjectinstanceofString){

StringanotherString=(String)anObject;

intn=;

if(n==){

charv1[]=value;

charv2[]=;

inti=0;

while(n--!=0){

if(v1[i]!=v2[i])

returnfal;

i++;

}

returntrue;

}

}

returnfal;

}

我们可以⾮常清晰的看到String的equals()⽅法是进⾏内容⽐较,⽽不是单纯的引⽤⽐较。

publicbooleanequals(Objectobj){

if(objinstanceofInteger){

returnvalue==((Integer)obj).intValue();

}

returnfal;

}

其他的就不⼀⼀举例了。

在Java中⽐较的推荐⽅法

所以我们⼀般⽐较基本数据类型的时候,使⽤"==",例如inti=0;if(i==1){…},⽐较两个Integer包装类类型的时候就可以使

⽤equals(),因为Java已经重写了equals()⽅法了。另外给出⼏点建议,在java中进⾏⽐较,我们需要根据⽐较的类型来选择

合适的⽐较⽅式:

1.对象域,使⽤equals⽅法。

2.类型安全的枚举,使⽤equals或==。

3.可能为null的对象域:使⽤==null和equals。

4.数组域:使⽤。

5.除float和double外的原始数据类型(int,byte等):使⽤==。

类型:使⽤IntBits转换成int类型,然后使⽤==。

类型:使⽤ToLongBit转换成long类型,然后使⽤==。

其中6,7参考java中的对应的包装类实现:

publicbooleanequals(Objectobj){

return(objinstanceofFloat)

&&(floatToIntBits(((Float)obj).value)==floatToIntBits(value));

}

}

为什么要在我们⾃⼰的类中重写equals()

但是有时候我们不满⾜于使⽤基本数据类型和Java实现的⼀些继承⾃Object的哪些类,⽐如我们实现⼀个Person类,它是继

承⾃Object类的,所以它的equals()⽅法默认使⽤的是⽂章开头提到的哪个equals()⽅法,当我们使⽤equals()进⾏⽐较的时

候,⽐较内存地址,那么有可能出现两个Person对象的参数都相同(⽐如年龄,⾝份证号等,在我们的实际认知中认为这两

个⼈就是⼀个⼈,应该返回true),但是由于他们的内存地址是不⼀样的,所以equals()⽅法会返回fal。

那么我们就需要去重写equals()⽅法。

重写equals()的规范

需要注意的是,在Java规范中,它对equals()⽅法的使⽤必须要遵循如下⼏个规则:

1.⾃反性:对于任何⾮空引⽤值x,(x)都应返回true。

2.对称性:对于任何⾮空引⽤值x和y,当且仅当(x)返回true时,(y)才应返回true。

3.传递性:对于任何⾮空引⽤值x、y和z,如果(y)返回true,并且(z)返回true,那么(z)应返

回true。

4.⼀致性:对于任何⾮空引⽤值x和y,多次调⽤(y)始终返回true或始终返回4、⼀致性:对于任何⾮空引⽤值

x和y,多次调⽤(y)始终返回true或始终返回fal,前提是对象上equals⽐较中所⽤的信息没有被修改

5.对于任何⾮空引⽤值x,(null)都应返回fal。

重写equals()可能的误区

查看下述代码:

publicclassTestEquals{

publicstaticvoidmain(String[]args){

Employeeemployee=newEmployee("mily",1);

Employeeemployee2=newEmployee("mily",2);

Personp1=newPerson("mily");

n((employee));

n((employee2));

n((employee2));

}

}

classPerson{

privateStringname;

publicStringgetName(){

returnname;

}

publicvoidtName(Stringname){

=name;

}

publicPerson(Stringname){

=name;

}

@Override

publicbooleanequals(Objectobj){

if(objinstanceofPerson){

Personperson=(Person)obj;

if(e()==null|name==null){

returnfal;

}el{

IgnoreCa(e());

}

}

returnfal;

}

}

classEmployeeextendsPerson{

privateintid;

publicintgetId(){

returnid;

}

publicvoidtId(intid){

=id;

}

publicEmployee(Stringname,intid){

super(name);

=id;

}

@Override

publicbooleanequals(Objectobj){

if(objinstanceofEmployee){

Employeeemployee=(Employee)obj;

(obj)&&()==id;

}

returnfal;

}

}

输出:

true

true

fal

上述代码中,我定义了⼀个Person类,有⼀个属性name;还定义了⼀个Employee类,它是Person的⼦类,多出⼀个id的属

性;在测试代码中“new”出了三个对象:

为mily,id为1的⼀个职员——employee

为mily,id为2的职员——employee2

为mily的⼀个普通⼈——p1

在⼤家的认知下,应该是三者都不是“equal”的,但是在执⾏(employee)时返回的是true,仔细看了代码之后你就会

发现问题所在,代码把employee当成⼀个Person对象去执⾏equals⽅法了,⽐较了name发现⼀样,就认为是“equal”了,这

是⼀种很常见的误区。

⼀般的equals()写法

下⾯给出⼀个完美的equals⽅法的建议:

1、显⽰参数命名为otherObject,稍后会将它转换成另⼀个叫做other的变量。

2、判断⽐较的两个对象引⽤是否相等,如果引⽤相等那么表⽰是同⼀个对象,那么当然相等

3、如果otherObject为null,直接返回fal,表⽰不相等

4、⽐较this和otherObject是否是同⼀个类:如果equals的语义在每个⼦类中有所改变,就使⽤getClass检测;如果所有

的⼦类都有统⼀的定义,那么使⽤instanceof检测

5、将otherObject转换成对应的类类型变量

6、最后对对象的属性进⾏⽐较。使⽤==⽐较基本类型,使⽤equals⽐较对象。如果都相等则返回true,否则返回fal。注

意如果是在⼦类中定义equals,则要包含(other)

按照上述的equals()规范,我的实现如下:

publicclassTestEquals2{

publicstaticvoidmain(String[]args){

Employeeemployee=newEmployee("mily",1);

Employeeemployee2=newEmployee("mily",1);

Personp1=newPerson("mily");

n((employee));

n((employee2));

n((employee2));

Employeeemployee3=newEmployee(null,1);

Employeeemployee4=newEmployee(null,1);

Personp2=newPerson(null);

n((employee3));

n((employee4));

n((employee4));

}

}

classPerson{

privateStringname;

publicStringgetName(){

returnname;

}

publicvoidtName(Stringname){

=name;

}

publicPerson(Stringname){

=name;

}

@Override

publicbooleanequals(Objectobj){

if(this==obj){

returntrue;

}

if(obj==null||getClass()!=ss()){

returnfal;

}

Personperson=(Person)obj;

if(e()==null|name==null){

returnfal;

}el{

IgnoreCa(e());

}

}

}

classEmployeeextendsPerson{

privateintid;

publicintgetId(){

returnid;

}

publicvoidtId(intid){

=id;

}

publicEmployee(Stringname,intid){

super(name);

=id;

}

@Override

publicbooleanequals(Objectobj){

if(this==obj){

returntrue;

}

if(obj==null||getClass()!=ss()){

returnfal;

}

Employeeemployee=(Employee)obj;

if(e()==null|getName()==null){

returnfal;

}el{

returngetName().equalsIgnoreCa(e())&&()==id;

}

}

}

结果:

fal

fal

true

fal

fal

fal

附:java中equals()⽅法的正确使⽤

在Java中⽐较两个字符串是否相等,想必只要不是初学者都知道⽤equals()⽅法来进⾏⽐较,但是实际上很多时候都⽤错了。

就我⾃⼰开发⽽⾔,加⼊⽐较⼀个Strings的内容是否是"aaa"时,往往会写成如下代码:

if(("aaa")){

...

}

乍⼀看没什么问题,直到我装了AlibabaCodingGuidelines这个插件,⼀检查,就告诉我这样不对了。

为什么呢?因为很多情况下,并不能保证字符串s是不是为null,即直接这么判断,很容易产⽣空指针异常的错误,因此正确

的使⽤⽅法应该是:

"aaa".equals(s);

总结

到此这篇关于Java中equals()⽅法的⽂章就介绍到这了,更多相关Javaequals()⽅法内容请搜索以前的⽂章或继续浏览下⾯的相

关⽂章希望⼤家以后多多⽀持!

本文发布于:2022-12-27 21:17:00,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/42690.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:expression
下一篇:very
标签:equal
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图