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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡志翔 中级黑马   /  2013-10-22 23:03  /  1379 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. String s1 = "He"+"llo";
  2. String s2 = "Hello";
  3. System.out.println(s1.equals(s2));
  4. System.out.println(s1 == s2);
复制代码
  1. String s1 = "He";
  2. String s2 = "llo";
  3. String s3 = s1 + s2;
  4. String s4 = "Hello";
  5. System.out.println(s3.equals(s4));
  6. System.out.println(s3 == s4);
复制代码
为什么第一段代码s1==s2是true,而第二段代码s3==s4是false?

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

4 个回复

倒序浏览
System.out.println(s1.equals(s2));      //1.这里比较的是s1和s2的内容,相同返回true
System.out.println(s1 == s2);           //2.这里比较的是s1和s2的引用,因为 String类是不可变的,对String类的任何改变,都是返回一个新的String类对象,而你两个
                                                       的值是相同的,所以默认指向同一个对象“hello”,返回true
System.out.println(s3.equals(s4));      //3.同上1
System.out.println(s3 == s4);           //个人理解是,s1和s2各自指向一个对象,当建立s3时,里面包含的是对s1和s2两个引用对象的指向,而s4是指向的是“hello”,返回false

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
String s1 = "He"+"llo";String s2 = "Hello";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
---------------------------------------------------------------------
String s1 = "He";
String s2 = "llo";
String s3 = s1 + s2;
String s4 = "Hello";
System.out.println(s3.equals(s4));
System.out.println(s3 == s4);

关于字符串池的概念你可以去百度或者书籍中了解,这里我不作介绍,楼主疑惑的问题我猜是红色部分代码的区别。
第一种情况jvm(java虚拟机)会自动做一个操作,这个操作就是把 "He"+"llo"变成"Hello",这样这句话就变成了String s1 = "Hello";
第二种情况是因为java对两个String相加的功能源码上返回的是一个String类型的对象,所以,新建的对象在字符串池外部。
这就是问题的根本原因。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报 1 0
String s1 = "He"+"llo";// 这代码jvm会在编译时使它变成  String s1 = "Hello"; 所以第一段代码都是常量池的Hello,结果为true
String s3 = s1 + s2;//这代码实际是调用了StringBuffer,其操作相当于StringBuffer sb = new StringBuffer();   sb.append(s1);     sb.append(s2);  String s3 = sb; 这里new了一个对象,与常量池中的不是同一个地址的 所以第二段代码s3==s4是false

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报 1 0
如果问题已经解决,请及时修改主题至“提问结束”
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马