首先我们知道java中object类是所有类的父类,它里面定义了equals()方法:
public boolean equals(object obj) { return (this == obj); }
可以看到是使用= =来进行比较的,那么= =是什么意思呢?其实是比较两个对象的的内存地址。(这里顺便提一下,可以去了解一下java的堆栈。)
=》若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。
这里我们看一下java的一些自带的包装类怎么重写equals()的:
string.java
public boolean equals(object anobject) { if (this == anobject) { return true; } if (anobject instanceof string) { strin教育名言g anotherstring = (string)anobject; int n = value.length; if (n == anotherstring.value.length) { char v1[] = value; char v2[] = anotherstring.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return fal; i++; } return true; } } return fal; }
我们可以非常清晰的看到string的equals()方法是进行内容比较,而不是单纯的引用比较。
integer.java
public boolean equals(object obj) { if (obj instanceof integer) { return value == ((integer)obj).intvalue(); } return fal; }
其他的就不一一举例了。
所以我们一般比较基本数据类型的时候,使用”==”,例如 int i = 0; if (i == 1){…},比较两个integer包装类类型的时候就可以使用equals(),因为java已经重写了equals()方法了。另外给出几点建议,在java中进行比较,我们需要根据比较的类型来选择合适的比较方式:
对象域,使用equals方法 。类型安全的枚举,使用equals或== 。可能为null的对象域 : 使用==null 和 equals 。数组域 : 使用 arrays.equals 。除float和double外的原始数据类型(int,byte等) : 使用 == 。float类型: 使用float.foattointbits转换成int类型,然后使用==。double类型: 使用double.doubletolongbit转换成long类型,然后使用==。其中6,7参考java中的对应的包装类实现:
public boolean equals(object obj) { return (obj instanceof float) && (floattointbits(((float)obj).value) == floattointb广州百佳超市地址its(value)); }}
但是有时候我们不满足于使用基本数据类型和java实现的一些继承自object的哪些类,比如我们实现一个person类,它是继承自object类的,所以它的equals()方法默认使用的是文章开头提到的哪个equals()方法,当我们使用equals()进行比较的时候,比较内存地址,那么有可能出现两个person对象的参数都相同(比如年龄,身份证号等,在我们的实际认知中认为这两个人就是一个人,应该返回true),但是由于他们的内存地址是不一样的,所以equals()方法会返回fal。
那么我们就需要去重写equals()方法。
需要注意的是,在java规范中,它对equals()方法的使用必须要遵循如下几个规则:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。对称性:对于任何非空引用值 x 和 y,当且仅当y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。传递性:对于任何非空引用值 x、y 和z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回fal,前提是对象上 equals 比较中所用的信息没有被修改对于任何非空引用值 x,x.equals(null) 都应返回fal。查看下述代码:
public class testequals { public static void main(string[] args) { employee employee = new employee(爱的艺术 弗洛姆"mily",1); employee employee2 = new employee("mily",2); person p1 = new person("mily"); system.out.prin离职信范本tln(p1.equals(employee)); system.out.println(p1.equals(employee2)); system.out.println(employee.equals(employee2)); }}class person { private string name; public string getname() { return name; } public void tname(string name) { this.name = name; } public person(string name) { this.name = name; } @override public boolean 网络信息安全承诺书equals(object obj) { if (obj instanceof person) { person person = (person) obj; if (person.getname() == null | name == null) { return fal; } el { return name.equalsignoreca(person.getname()); } } return fal; }}class employee extends person { private int id; public int getid() { return id; } public void tid(int id) { this.id = id; } public employee(string name, int id) { super(name); this.id = id; } @override public boolean equals(object obj) { if (obj instanceof employee) { employee employee = (employee) obj; return super.equals(obj) && employee.getid() == id; } return fal; }}
输出:
true
true
fal
上述代码中,我定义了一个person类,有一个属性name;还定义了一个employee类,它是person的子类,多出一个id的属性;在测试代码中“new”出了三个对象:
name为mily,id为1的一个职员 —— employeename为mily,id为2的职员 —— employee2name为mily的一个普通人 —— p1在大家的认知下,应该是三者都不是“equal”的,但是在执行 p1.equals(employee)时返回的是true,仔细看了代码之后你就会发现问题所在,代码把employee当成一个person对象去执行equals方法了,比较了name发现一样,就认为是“equal”了,这是一种很常见的误区。
下面给出一个完美的 equals 方法的建议:
1、显示参数命名为 otherobject,稍后会将它转换成另一个叫做 other 的变量。
2、判断比较的两个对象引用是否相等,如果引用相等那么表示是同一个对象,那么当然相等
3、如果 otherobject 为 null,直接返回fal,表示不相等
4、比较 this 和 otherobject 是否是同一个类:如果 equals 的语义在每个子类中有所改变,就使用 getclass 检测;如果所有的子类都有统一的定义,那么使用 instanceof 检测
5、将 otherobject 转换成对应的类类型变量
6、最后对对象的属性进行比较。使用 == 比较基本类型,使用 equals 比较对象。如果都相等则返回true,否则返回fal。注意如果是在子类中定义equals,则要包含 super.equals(other)
按照上述的equals()规范,我的实现如下:
public class testequals2 { public static void main(string[] args) { employee employee = new employee("mily",1); employee employee2 = new employee("mily",1); person p1 = new person("mily"); system.out.println(p1.equals(employee)); system.out.println(p1.equals(employee2)); system.out.println(employee.equals(employee2)); employee employee3 = new employee(null,1); employee employee4 = new employee(null,1); person p2 = new person(null); system.out.println(p2.equals(employee3)); system.out.println(p2.equals(employee4)); system.out.println(employee3.equals(employee4)); }}class person { private string name; public string getname() { return name; } public void tname(string name) { this.name = name; } public person(string name) { this.name = name; } @override public boolean equals(object obj) { if(this == obj){ return true; } if(obj == null || getclass() != obj.getclass()){ return fal; } person person = (person) obj; if(person.getname() == null | name == null) { return fal; } el { return name.equalsignoreca(person.getname()); } }}class employee extends person { private int id; public int getid() { return id; } public void tid(int id) { this.id = id; } public employee(string name, int id) { super(name); this.id = id; } @override public boolean equals(object obj) { if(this == obj){ return true; } if(obj == null || getclass() != obj.getclass()){ return fal; } employee employee = (employee) obj; if(employee.getname() == null | getname() == null) { return fal; }el { return getname().equalsignoreca(employee.getname()) && employee.getid() == id; } }}
结果:
fal
fal
true
fal
fal
fal
在java中比较两个字符串是否相等,想必只要不是初学者都知道用equals()方法来进行比较,但是实际上很多时候都用错了。
就我自己开发而言,加入比较一个string s的内容是否是”aaa”时,往往会写成如下代码:
if(s.equals("aaa")){ ...}
乍一看没什么问题,直到我装了alibaba coding guidelines 这个插件,一检查,就告诉我这样不对了。
为什么呢?因为很多情况下,并不能保证字符串s是不是为null,即直接这么判断,很容易产生空指针异常的错误,因此正确的使用方法应该是:
"aaa".equals(s);
到此这篇关于java中equals()方法的文章就介绍到这了,更多相关javaequals()方法内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 05:20:57,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/97d70139dd10ed1b111af4093e361ace.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java中equals()方法实例详解.doc
本文 PDF 下载地址:Java中equals()方法实例详解.pdf
留言与评论(共有 0 条评论) |