浏览 1951 次
锁定老帖子 主题:(十四):==和equals的区别
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-28
最后修改:2009-03-03
public class Person { String name; public Person(String name){ this.name = name; } @Override public boolean equals(Object anObject){ //仿照String类的equals方法来写 if(this == anObject) return true; if(anObject instanceof Person){ Person p = (Person)anObject; if(p.name.equals(this.name)) return true; } return false; } } public class Equals==Test { public static void main(String[] args) { String str = new String("abc"); //语句(1) String str2 = new String("abc");//语句(2) System.out.println(str == str2);//语句(3) System.out.println(str.equals(str2));//语句(4) Object object = new Object();//语句(5) Object object2 = new Object();//语句(6) System.out.println(object == object2);//语句(7) System.out.println(object.equals(object2));//语句(8) Person p = new Person("zhangsan");//语句(9) Person p2 = new Person("zhangsan");//语句(10) System.out.println(p == p2);//语句(11) System.out.println(p.equals(p2));//语句(12) } } 问题1:执行完语句(3)(4)打印的结果是什么?说明理由 解答:执行完语句(3)(4)打印的结果是false和true。 分析:str和str2是引用,它们指向不同的对象,内存地址不同,所以str==str2为false。我们看看String的equals方法的源码,它是对Object的equals方法的重写: public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }注意:String类把Object类的equals方法重写了,所以它比较的确实是对象的内容。 问题2:执行完语句(7)(8)打印的结果是什么?说明理由。 解答:执行完语句(7)(8)打印的结果是false和false。 分析:object和object2是引用,它们指向不同的对象,内存地址不同,所以object==object2为false。 查看jdk的源代码,我们发现equals方法定义在Object类里面,所以所有类都有这个方法。Object类是这样定义equals方法的: public boolean equals(Object obj) {return (this == obj); }从这里可以看出,Object类里面的equals方法和==是等价的,它比较的也是内存地址。 问题3:执行完语句(11)(12)打印的结果是什么?说明理由。 解答:执行完语句(11)(12)打印的结果是false和false。分析:Person类没有重写Object类的equals方法。 总结:==和equals()方法有什么区别?我们不能笼统的说,equals方法比较的是内容。我们应该说"=="永远比较的是内存地址。对于equals方法,在Object类的层次上来说,它比较的是内存地址,和"=="一样。如果一个子类重写了Object类的equals方法,这个时候这个equals方法才正真比较的是内容。 要求:在自定义类的时候,如果要进行相等性的比较,必须要重写父类的equals方法。怎么重写equals方法,它有固定的模式(要重写hashCode,下次课讲),对于Person类 来说,如果两个Pereson的name相同,它就应该返回true,否则返回false。参见Person类的equals方法。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |