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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卞新浩 中级黑马   /  2014-7-11 23:00  /  1308 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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


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

8 个回复

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

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

谢谢大神  明白了
回复 使用道具 举报
zhohao 中级黑马 2014-7-13 08:55:23
8#
从结果上推断就知道了,第一个false是进行的地址值比较,都是new对象两个不同的地址值;第二个true,表明对equals进行了覆盖比较的是对象的内容;第三个false是缓冲区地址值的比较,两个不同的缓冲区。(因为没有覆盖equals方法)
回复 使用道具 举报
==是地址值的比较,equals是内容比较。String才有这个方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马