黑马程序员技术交流社区

标题: 关于Equals方法 [打印本页]

作者: 卞新浩    时间: 2014-7-11 23:00
标题: 关于Equals方法
String s1 = new String("hello java");
String s2 = new String("hello java");

StringBuffer sb1 = new StringBuffer("hello java");
StringBuffer sb2 = new StringBuffer("hello java");

System.out.println(s1 ==s2);
System.out.println(s1.equals(s2));
System.out.println(sb1.equals(sb2));

运行的结果是
false
true
false


为什么呢??求大神解释清楚

作者: hmid    时间: 2014-7-12 01:42
==比较的是对象引用的值,s1和s2是两个不同的对象应用,所以是false;
equals方法在Object的实现是用==比较;
而String重写了equals方法,比较的是对象应用指向对象的实际的值,所以true。
StringBuffer没有重写equals方法,所以就false了。
作者: yanyoucheng520    时间: 2014-7-12 02:06
首先字符串比较是不可以直接用==来进行,而后StringBuffer类型的字符串比较,用equals比较的是地址,而上面的sb1,sb2虽然内容一样,但是存储的地址肯定是不一样的, 所以还需要用tostring转换成string类型,再用equals比较
作者: Adjin    时间: 2014-7-12 10:24
只知道前两个,==比较的是字符串的地址,不一样,
第二个equals比较的是两个里面内容是不是一样
作者: 卞新浩    时间: 2014-7-12 21:09
hmid 发表于 2014-7-12 01:42
==比较的是对象引用的值,s1和s2是两个不同的对象应用,所以是false;
equals方法在Object的实现是用==比较 ...

感谢大神的指导
作者: 汉谟拉比    时间: 2014-7-12 21:36
你一个s1==s2比较的是内存中的地址值,第二个比较的字符串的内容是否相等(应为String复写了equals方法,用来比较字符串北荣是否相等),第三个比较仍是地址值(应该是该类没有复写equals,仍是用的object中的方法,所以仍是false
作者: 卞新浩    时间: 2014-7-12 21:48
汉谟拉比 发表于 2014-7-12 21:36
你一个s1==s2比较的是内存中的地址值,第二个比较的字符串的内容是否相等(应为String复写了equals方法,用 ...

谢谢大神  明白了
作者: zhohao    时间: 2014-7-13 08:55
从结果上推断就知道了,第一个false是进行的地址值比较,都是new对象两个不同的地址值;第二个true,表明对equals进行了覆盖比较的是对象的内容;第三个false是缓冲区地址值的比较,两个不同的缓冲区。(因为没有覆盖equals方法)
作者: flyidea    时间: 2014-7-13 10:38
==是地址值的比较,equals是内容比较。String才有这个方法。




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