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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 目标 中级黑马   /  2014-3-17 21:22  /  1318 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class StringText {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 String s1 = "黑马";
  5.                 String s2 = "程序员";
  6.                 String s3 = s1 + s2;
  7.                 String s4 = "黑马程序员";
  8.                 System.out.println(s3.equals(s4));
  9.                 System.out.println(s3 == s4);
  10.                
  11.         }

  12. }
复制代码
结果是:
true
false
但不知道为什么?该怎么理解?

评分

参与人数 1黑马币 +1 收起 理由
zzkang0206 + 1 毕老师的基础视频,讲String的第一讲有提到.

查看全部评分

6 个回复

倒序浏览
这就是字符串中“==”和equals的区别,你就简单理解为:equals比较的是值,“==”比较的是对象,就能明白了。值得强调的是,String不是基本数据类型。你上面s3和s4指向的是两个不同的字符串对象,所以为false。但是他们的值是相等的,所以equals为true。

评分

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

查看全部评分

回复 使用道具 举报
Strinhg中的equals()方法比较的是字符串的内容,内容相同返回true,不同则返回false。而“=“比较的是地址,地址不同则为false

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 duanyoujiji 于 2014-3-17 22:54 编辑

equals 比较的是内容,你的疑问应该是为什么输出false吧。
== 比较的是地址。
s1+s2是字符串的串联操作, 通过Builder或者Buffer类及其 append 方法实现的,创建了一个实例对象s3,这么说你就该明白了:就是new String ()道理一样。对象不一样地址也就不一样了。
所以输出结果是false 。如果改成s3="黑马"+"程序员"  ;s3==s4 结果就是true了。

评分

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

查看全部评分

回复 使用道具 举报 1 0
本帖最后由 nicholyx 于 2014-3-17 22:14 编辑

  1. //增加了一点小知识,楼主瞧瞧吧
  2. public class StringText {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 String s1 = "黑马";
  6.                 String s2 = "程序员";
  7.                 String s3 = s1 + s2;
  8.                 String s4 = "黑马程序员";
  9.                 String s5 = "黑马" + "程序员";  //和s4一样,都是指向同一个字符串常量,下面有解释
  10.                 System.out.println(s3.equals(s4));  //true
  11.                 System.out.println(s3 == s4);       //false
  12.                 System.out.println(s4 == s5);       //true
  13.         }

  14. }
  15. /*
  16. 输出结果:
  17. true
  18. false
  19. true

  20. 解释:
  21. 至于 == 与 equals 的用法上面说的很清楚了,我说下我自己加进去的这个。

  22. 因为s4是字符串常量"黑马程序员",而字符串常量在编译期就被确定了,而s5中"黑马"和"程序员"也都是字符串常量,当一个字符串由多个字符串常量连
  23. 接而成时,它自己肯定也是字符串常量,所以s5也同样在编译期就被解析为一个字符串常量,由于s4和s5这两个字符串常量的字面值一样,
  24. 所以s4 和 s5 指向常量池中同一个字符串常量"黑马程序员"。
  25. 所以 s4 == s5  -->  true;

  26. */

复制代码

评分

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

查看全部评分

回复 使用道具 举报
equals方法只比较两个String的值,不比较地址
使用==号实际比较地址与值都相同
使用jad反编译代码如下:

  1.         String s3 = (new StringBuilder(String.valueOf(s1))).append(s2).toString();
复制代码

观察s3,发现当进行加法时,实际是先new了stringBuilder对象,将s3指向它,所以当比较s3与s4时,会返回false

评分

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

查看全部评分

回复 使用道具 举报
  1. public class Test07 {

  2.       public static void main(String[] args) {
  3.                 String s1 = "黑马";
  4.                 String s2 = "程序员";
  5.                 String s3 = s1 + s2;
  6.                 String s4 = "黑马程序员";
  7.               /*Object 类的 equals (x.eauals(y))
  8.                * 方法实现对象上差别可能性最大的相等关系;
  9.                * 即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,
  10.                * 此方法才返回 true(x == y 具有值 true)。
  11.                * 但是String类复写了次方法
  12.                * 如果给定对象表示的 String 与此 String 相等,
  13.                * 则返回 true;否则返回 false。
  14.                * 所以s3.equals(s4)为true,但是又是两个对象所以s3 == s4为false
  15.                */
  16.                System.out.println(s3.equals(s4));
  17.                System.out.println(s3 == s4);
  18.       }
  19. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马