A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔浩 黑马帝   /  2011-11-21 08:53  /  2286 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

强子 黑马帝 2011-11-21 09:26:44
楼主
我的理解是ab1和ab2是两个不同的对象
其内存地址不相同所以为false
String、Integer、Boolean、Double等这些类都重写了equals和hashCode方法,这两个方法是根据对象的内容来比较和计算hashCode的。(详细可以查看jdk下的String.java源代码),所以只要对象的基本类型值相同,那么hashcode就一定相同。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
张晨 黑马帝 2011-11-21 09:33:18
沙发
说明哈希值不是地址值{:soso_e100:}
回复 使用道具 举报
本帖最后由 崔浩 于 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,
不知道我哪里理解错了,

6 个回复

倒序浏览
“= =”比较两个变量本身的值,即两个对象在内存中的首地址。
回复 使用道具 举报
String ab1="ab";
String b="b";
String ab2="a"+b;

ab1指向了"ab"这个常量的地址
ab2指向了“a”这个常量的地址,所以他们的地址是不同的,但是指向的内容相同,所以equals方法相等。
回复 使用道具 举报
冯敏 黑马帝 2011-11-21 14:37:34
地板
其实ab1和ab2地址是不相同的,它们是两个不同的对象,只不过是指向的内容相同罢了,equals方法比较的是内容,==比较的是地址
回复 使用道具 举报
在说你的问题之前,先说说下面两个问题
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"
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马