黑马程序员技术交流社区

标题: String中的一个问题,求解答? [打印本页]

作者: 目标    时间: 2014-3-17 21:22
标题: String中的一个问题,求解答?
  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
但不知道为什么?该怎么理解?


作者: luoanjade    时间: 2014-3-17 21:30
这就是字符串中“==”和equals的区别,你就简单理解为:equals比较的是值,“==”比较的是对象,就能明白了。值得强调的是,String不是基本数据类型。你上面s3和s4指向的是两个不同的字符串对象,所以为false。但是他们的值是相等的,所以equals为true。
作者: 等你的季节    时间: 2014-3-17 21:32
Strinhg中的equals()方法比较的是字符串的内容,内容相同返回true,不同则返回false。而“=“比较的是地址,地址不同则为false
作者: duanyoujiji    时间: 2014-3-17 21:35
本帖最后由 duanyoujiji 于 2014-3-17 22:54 编辑

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

作者: nicholyx    时间: 2014-3-17 22:06
本帖最后由 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. */

复制代码

作者: 刘一博    时间: 2014-3-17 23:12
equals方法只比较两个String的值,不比较地址
使用==号实际比较地址与值都相同
使用jad反编译代码如下:

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

观察s3,发现当进行加法时,实际是先new了stringBuilder对象,将s3指向它,所以当比较s3与s4时,会返回false
作者: 王浩龙    时间: 2014-3-18 11:38
  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. }
复制代码





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