在说你的问题之前,先说说下面两个问题
1.Object类中的equals()方法
public boolean equals(Object obj) {
return (this == obj);//注意此处的"=="号,
}
从上面源码可以看出:object中的equals就是用"=="来实现的,说明在比较对象时"=="和equals()的作用是相同的
下面实例说明:
Person p1 = new Person("zhangsan");
Person p2 = new Person("zhangsan");
System.out.println("p1 == p2?"+(p1 == p2));
System.out.println("p1.equals(p2)?"+p1.equals(p2));
打印结果:
p1 == p2?false
p1.equals(p2)?false
注意:
p1,p2是两个引用类型在stack中所存放的值是本身所指向Heap(堆)中对象的地址值。
"=="和"equals"比较的都是两个对象的引用是否指向了同一对象,也就是是否指向了堆中的同一内存地址。
2.覆盖Object类中的equals()方法之后
equals()方法用以判断两个对象的内容是否相等。
String s1=new String("abc");
String s2=new String("abc");
System.out.println("s1==s2?"+(s1==s2));//false
System.out.println("s1.equals(s2)?"+s1.equals(s2));//true
此例"=="比较是两个引用类型变量s1和s2指向的不是同一对象,也就是它们在栈中保存的对旬在堆中的内存地址是不一样的。
重写了Object类的equals()方法之后 ,equals()比较的不再是对象的内存地址,而是对象的内容,如本例中两个对象的内容均为"abc",则s1.equals(s2)返回true。
-----------------------------------------
下面说说你这个例子:
我个人理解:
引用类型变量ab1指向了堆中的对象"ab"
而ab2指向的不是对象"ab",可以把"a"+b当作一个整体(对象),因为b也是一个引用类型变量,它也指向了一个对象"b",这样就可能导致"a"+b变成了一个新的对象。所以,"ab"就不同于"a"+b
所以
ab1 == ab2返回false,表示s1,s2指向了不同对象的内存地址.
ab1.equals(ab2)返回true,表示s1,s2比较的是对象的内容都是"ab" |