黑马程序员技术交流社区

标题: 再看一下equals和== [打印本页]

作者: 崔浩    时间: 2011-11-21 08:53
标题: 再看一下equals和==
本帖最后由 崔浩 于 2011-11-21 14:54 编辑

public class Demo2
{

public static void main(String agrs[])
{
String ab1="ab";
String b="b";
String ab2="a"+b;
System.out.println(ab1.hashCode());
System.out.println(ab2.hashCode());
System.out.println(ab1.equals(ab2));
System.out.println(ab1==ab2);
}
}
打印结果:
3105
3105
true
false
俺就郁闷了,==是比较的字符序列和地址都相同时才为true,ab1和ab2的地址和字符序列都相等,为什么==就为false,
不知道我哪里理解错了,

作者: 强子    时间: 2011-11-21 09:26
我的理解是ab1和ab2是两个不同的对象
其内存地址不相同所以为false
String、Integer、Boolean、Double等这些类都重写了equals和hashCode方法,这两个方法是根据对象的内容来比较和计算hashCode的。(详细可以查看jdk下的String.java源代码),所以只要对象的基本类型值相同,那么hashcode就一定相同。
作者: 张晨    时间: 2011-11-21 09:33
说明哈希值不是地址值{:soso_e100:}
作者: moonlight    时间: 2011-11-21 11:12
“= =”比较两个变量本身的值,即两个对象在内存中的首地址。
作者: 程立彬    时间: 2011-11-21 12:59
String ab1="ab";
String b="b";
String ab2="a"+b;

ab1指向了"ab"这个常量的地址
ab2指向了“a”这个常量的地址,所以他们的地址是不同的,但是指向的内容相同,所以equals方法相等。
作者: 冯敏    时间: 2011-11-21 14:37
其实ab1和ab2地址是不相同的,它们是两个不同的对象,只不过是指向的内容相同罢了,equals方法比较的是内容,==比较的是地址
作者: zhou_411424    时间: 2011-11-21 14:45
在说你的问题之前,先说说下面两个问题
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"




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2