java面试 = =和equale的区别

Java常见笔试面试题目解析(十四):==和equals的区别
Java代码
1. public class Person {
2. String name;
3. public Person(String name){
4. https://www.360docs.net/doc/136198872.html, = name;
5. }
6. @Override
7. public boolean equals(Object anObject){
8. //仿照String类的equals方法来写
9. if(this == anObject) return true;
10. if(anObject instanceof Person){
11. Person p = (Person)anObject;
12. if(https://www.360docs.net/doc/136198872.html,.equals(https://www.360docs.net/doc/136198872.html,))
13. return true;
14. }
15. return false;
16. }
17. }
18.
19. public class Equals==Test {
20. public static void main(String[] args) {
21. String str = new String("abc"); //语句(1)
22. String str2 = new String("abc");//语句(2)
23.
24. System.out.println(str == str2);//语句(3)
25. System.out.println(str.equals(str2));//语句(4)
26.
27. Object object = new Object();//语句(5)
28. Object object2 = new Object();//语句(6)
29.
30. System.out.println(object == object2);//语句(7)
31. System.out.println(object.equals(object2));//语句(8)
32.
33. Person p = new Person("zhangsan");//语句(9)
34. Person p2 = new Person("zhangsan");//语句(10)
35.
36. System.out.println(p == p2);//语句(11)
37. System.out.println(p.equals(p2));//语句(12)
38. }
39. }
40. 问题1:执行完语句(3)(4)打印的结果是什么?说明理由
解答:执行完语句(3)(4)打印的结果是false和true。
分析:str和str2是引用,它们指向不同的对象,内存地址不同,所以str==str2为false。我们看看String的equals方法的源码,它是对Object的equals方法的重写:
Java代码
public boolean equals(Object anObject) {
1. if (this == anObject) { return true; }
2. if (anObject instanceof String) {
3. String anotherString = (String)anObject;
4. int n = count;
5. if (n == anotherString.count) {
6. char v1[] = value;
7. char v2[] = anotherString.value;
8. int i = offset;
9. int j = anotherString.offset;
10. while (n-- != 0) {
11. if (v1[i++] != v2[j++]) return false;
12. }
13. return true;
14. }
15. }
16. return false;
注意:String类把Object类的equals方法重写了,所以它比较的确实是对象的内容。

问题2:执行完语句(7)(8)打印的结果是什么?说明理由。
解答:执行完语句(7)(8)打印的结果是false和false。
分析:object和object2是引用,它们指向不同的对象,内存地址不同,所以object==object2为false。
查看jdk的源代码,我们发现equals方法定义在Object类里面,所以所有

类都有这个方法。Object类是这样定义equals方法的:
Java代码 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方法。


相关文档
最新文档