1、Java中判断对象是否相等的equals方法使用教程资料与=运算符响应,equals()方法也是Java中对对象进行比较的一大方式,要特别注意二者的不 同点,这个我们在下文中即将讲到,接下来我们就来看一下 Java中判断对象是否相等的 equals()方法使用教程Object类中的equals方法用于检测一个对象是否等于另一个对象。在 Object类中,这个方法判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的。从这点上看,将其作为默认操作也是合乎情理的。 然而,对于多数类类说,这种判断并没有什么意义,例如,采用这种方式比较两个 PrintStream是否相等就完全没
2、有意义。然而,经常需要检测两个对象状态的相等性, 如果两个对象的状态相等, 就认为这两个对象是相等的。所以一般在自定义类中都要重写 equals比较。F面给出编写一个完美 equals()方法的建议:(1 )显式参数命名为 otherObject,稍后需要将转换成一个叫 other的变量(2)检测this与otherObject是否引用同一个对象:1if(this=otherObject) return true;这条语句只是一个优化。 实际上,这是一种经常采用的形式。 因为计算这个等式要比一个一个地比较类中的域所付出的代价小的多。(3)检测otherObject是否为null,如果为null
3、,返回false。这项检测是很必要的。1if(otherObject=null) return false;(4)比较this和otherObject是否属于同一个类,如果equals的语义在每个子类中有所改变, 就使用getClass()检测,它将自己作为目标类1 if(getClass()!=otherObject.getClass() return false;如果所有的子类都拥有同一的语义,就使用 in sta nceof检测1 if(!(otherObject in sta nceof ClassName) return false;(5)将otherObject转换为相应类型的变量
4、:1 ClassName other=(ClassName)otherObject;(6) 现在开始对所有需要比较的域进行比较。使用 =比较基本类型域,使用 equals比较对象域。如果所有域都匹配,就返回 true,否则返回false;1 return field1=other.field1 & field2.equals(other.field2)如果在子类中重新定义 equals,就要在其中包含调用 super.equals(other)。如果检测失败,就不可能相等。如果超类中的域相等,就比较子类中的实例域。对于数组类型的域,可以使用静态的 Arrays.equals方法检测相应的元素是
5、否相等。来看几个字符串比较例子:1Stri ng a = abc;2Stri ng b = abc;3String c = new Strin g(abc);4String d = new Strin g(abc);5System.out.println(a = b); / true 因为JAVA中字符串常量是共享的,只有一个拷贝6System.out.println(a - c); / false a 和 c属于 2 个不冋的对象 17System.out.println(a.equals(c); / true 由于 String 对象的 equals方法比较的是对象中的值,8所以返回tru
6、e。(和Object的equals方法不同)9System.out.println(c=d); / false c和d虽然对象内的值相同, 但属于2个不同的对象, 所以不相等System.out.pri ntln( c.equals(d); / true简单的说,当比较字符串常量时,等于和 equals返回的结果一样,当想比较字符串对象的 值时用equals。看一个equals的使用例子:1package chapterO5.EqualsTest;2import java.util.*;3public class EqualsTest 4public static void main(Stri
7、ng args) 5Employee alice1 = new Employee(Alice Adams, 75000, 1987, 12, 15);6Employee alice2 = alice1; / reference the same object7Employee alice3 = new Employee(Alice Adams, 75000, 1987, 12, 15);8Employee bob = new Employee(Bob Brandson, 50000, 1989, 10, 1);9System.out.pri ntln (alice1 = alice2: + (
8、alice1 = alice2);10System.out.pri ntln (alice1 = alice3: + (alice1 = alice3);11System.out.pri ntl n(alice1.equals(alice3): + (alice1.equals(alice3);12System.out.pri ntln (alice1.equals(bob): + (alice1.equals(bob);13System.out.pri ntln( bob.toStri ng();141516class Employee 17public Employee(Stri ng n
9、, double s, int year, i nt mon th, int day) 18n ame = n;19salary = s;20Gregoria nCale ndar cale ndar = new Gregoria nCale ndar(year, mon th, day);21hireDay = cale ndar.getTime();2223public String getName() 24return n ame;2526public double getSalary() 27return salary;2829public Date getHireDay() 30re
10、turn hireDay;3132public void raiseSalary(double byPerce nt) 33double raise = salary * byPerce nt / 100;34salary += raise;35 37383940414243444546474849505152535455565758596061626364656667686970717273747576777879public boolea n equals(Object otherObject) / a quick test to see if the objects are ide nt
11、ical if (this = otherObject) return true;/ must retur n false if the explicit parameter is n ullif (otherObject = n ull) return false;/ if the classed dont match,they cant be equalif (getClass() != otherObject.getClass() return false;/ now we know otherObject is a www.hu nanwang.n etyee Employee oth
12、er = (Employee) otherObject;/ test whether the fields hava ide ntical values retur n n ame.equals(other. name) & salary = other.salary& hireDay.equals(other.hireDay);Overridepublic int hashCode() return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13 * hireDay.hashCode();Overridepublic
13、 Stri ng toStri ng() retur n getClass().getName() + name= + n ame + ,salary= + salary+ ,hireDay= + hireDay + ;private String name;private double salary;private Date hireDay;class Man ager exte nds Employee public Man ager(Stri ng n, double s, int year, i nt mon th, int day) super( n, s, year, mon th
14、, day);bouns = 0;Overridepublic double getSalary() double baseSalary = super.getSalary();retur n baseSalary + bouns;public void setBo un s(double b) bouns = b;8081828384858687888990919293949596979899100101102103104105106107108109110111112113114115Overridepublic boolea n equals(Object otherObject) if
15、 (!super.equals(otherObject)return false;Man ager other = (Ma nager) otherObject;/ super equals checked that this and other bel ong to the same class retur n bouns = other.bo uns;Overridepublic int hashCode() retur n super.hashCode() + 17 * new Double(bo un s).hashCode();Overridepublic Stri ng toStr
16、i ng() retur n super.toStri ng() + bo un s= + bouns + ;private double bouns;深入下面根据类是否覆盖 equals。方法”,将它分为2类。(1)若某个类没有覆盖 equals。方法,当它的通过 equals。比较两个对象时,实际上是比较两 个对象是不是同一个对象。这时,等价于通过 =”去比较这两个对象。我们可以覆盖类的 equals。方法,来让equals。通过其它方式比较两个对象是否相等。通 常的做法是:若两个对象的内容相等,则 equals。方法返回true;否则,返回fasle。下面,举例对上面的 2种情况进行说明
17、。1.没有覆盖equals()方法”的情况代码如下 (EqualsTestl.java):1234import java.util.*;5import java .Ian g.Comparable;6/*7* desc equals()的测试程序。8*/9public class EqualsTest110public a in( Stri ng args) 11/新建2个相同内容的 Person对象,12/再用equals比较它们是否相等13Person p1 = new Perso n(eee, 100);14Person p2 = new Perso n(eee, 100);15Syst
18、em.out.pri ntf(%sn, p1.equals(p2);1617/*18* desc Pers on 类。19*/20private static class Person 21int age;22String n ame;23public Person( Stri ng n ame, int age) 24this .n ame = n ame;25this.age = age;2627public Stri ng toStri ng() 28retur n n ame + - +age;293031323334运行结果:复制代码代码如下false结果分析我们通过 p1.equa
19、ls(p2)来比较pl和p2是否相等时”。实际上,调用的Object.java的equals。 方法,即调用的 (p仁=p2)。它是比较“ pl和p2是否是同一个对象”。而由pl和p2的定义可知,它们虽然内容相同; 但它们是两个不同的对象!因此,返回结false。12345678910111213141516171819202122232425262728293031323334353637383940412.覆盖equals。方法”的情况我们修改上面的 EqualsTest1.java:覆盖equals。方法。代码如下(EqualsTest2.java):import java.util.*
20、;import java .Ian g.Comparable;/* desc equals()的测试程序。*/public class EqualsTest2public static void main(String args) /新建2个相同内容的 Person对象,/再用equals比较它们是否相等Person p1 = new Perso n(eee, 100);Person p2 = new Perso n(eee, 100);System.out.pri ntf(%sn, p1.equals(p2); /* desc Pers on 类。*/private static class
21、 Person int age;String n ame;public Person( Stri ng n ame, int age) this. name = n ame;this.age = age;public Stri ng toStri ng() retur n n ame + - +age;/* desc覆盖equals方法*/Overridepublic boolea n equals(Object obj) if(obj = n ull) return false;false/如果是同一个对象返回 true,反之返回if(this = obj)return true;判断是否类
22、型相同if(this.getClass() != obj.getClass() return false;424344454647484950515253545556Pers on pers on = (Pers on)obj;retur n n ame.equals(pers on.n ame) & age=pers on .age; 运行结果:复制代码代码如下true结果分析:我们在EqualsTest2.java中重写了 Person的equals()函数:当两个Person对象的 name和age 都相等,则返回true。因此,运行结果返回true。讲到这里,顺便说一下 java对eq
23、uals()的要求。有以下几点:对称性:如果 x.equals(y)返回是true,那么y.equals(x)也应该返回是true。反射性:x.equals(x)必须返回是true。类推性:如果 x.equals(y)返回是true,而且y.equals(z)返回是true,那么z.equals(x)也应该 返回是true。一致性:如果 x.equals(y)返回是true,只要x和y内容一直不变,不管你重复 x.equals(y)多少次,返回都是true。非空性,x.equals(null),永远返回是false ; x.equals(和x不同类型的对象)永远返回是false。现在,再回顾一
24、下 equals()的作用:判断两个对象是否相等。当我们重写 equals()的时候,可千万不好将它的作用给改变了!equals()与=的区别是什么?=:它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。equals():它的作用也是判断两个对象是否相等。但它一般有两种使用情况 (前面第1部分已详细介绍过):情况1,类没有覆盖equals()方法。则通过equals()比较该类的两个对象时, 等价于通过“=”比较这两个对象。情况2,类覆盖了 equals()方法。一般,我们都覆盖 equals()方法来两个对象的内容相等;若它们的内容相等,则返回 true(即,认为这两
25、个对象相等)。下面,通过示例比较它们的区别。代码如下:234567891011121314151617181920212223242526272829303132333435363738394041424344import java.util.*;import java .Ian g.Comparable;/* desc equals。的测试程序。*/public class EqualsTest3public static void main(String args) /新建2个相同内容的 Person对象,/再用equals比较它们是否相等Person p1 = new Perso n(e
26、ee, 100);Person p2 = new Perso n(eee, 100);System.out.printf(p1.equals(p2) : %sn, p1.equals(p2);System.out.printf(p1=p2 : %sn, p1=p2);/* desc Pers on 类。*/private static class Person int age;String n ame;public Person( Stri ng n ame, int age) this. name = n ame;this.age = age;public Stri ng toStri ng
27、() retur n n ame + - +age;/* desc覆盖equals方法*/Overridepublic boolea n equals(Object obj)if(obj = n ull)return false;/如果是同一个对象返回 true,反之返回falseif(this = obj)return true;判断是否类型相同if(this.getClass() != obj.getClass() return false;Pers on pers on = (Pers on)obj;45464748495051525354555657retur n n ame.equals(pers on.n ame) & age=pers on .age; 运行结果:1p1.equals(p2) : true2p1=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