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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卞潇洋 中级黑马   /  2012-12-13 20:56  /  2164 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 天堂木乃伊 于 2012-12-13 21:42 编辑

一个String中的问题,
String s1 = "你好";
String s2 = "我好";
String s3 ="你好我好";
System.out.println(s3==s1+s2);   //false;
System.out.println(s3=="你好"+"我好"); //true;
问题是第二个输出为何为true?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
查看帮助文档你会看见
public final class String  字符串是常量;它们的值在创建之后不能更改,因为 String 对象是不可变的,所以可以共享
所以s1和s2指向同一块内存空间,也就是指向同一个对象...
这样可以节省内存...java设计者考虑的....

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
  1. package src;

  2. class Test1{

  3. public static void main(String args[]){
  4. String s1 = "你好";
  5. String s2 = "我好";
  6. String s3 ="你好我好";
  7. System.out.println(s1==s3); //false;
  8. System.out.println(s1=="你好"+"我好"); //true;
  9. }
  10. }
复制代码

同学 你是不是搞错了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
cehkongfu 发表于 2012-12-13 21:30
同学 你是不是搞错了

写错了,问题已经改过来了
回复 使用道具 举报
本帖最后由 ying 于 2013-1-8 00:34 编辑

楼主的没有错!
String s1 = "你好";
String s2 = "我好";
String s3 ="你好我好";
System.out.println(s3==s1+s2);   //false;
System.out.println(s3=="你好"+"我好"); //true;
我再此解释一下第二个输出语句为true的原因

  首先你要搞清楚的是字符串用==比较,是比较两个字符串是不是指向同一个对象
  在程序运行的时候会创建一个字符串缓冲池,程序会把字符串变量放入缓冲池中,
  如程序中的 s1、s2、s3
  当使用表达式创建对象时,程序首先会在缓冲区中寻找是否有相同值的对象 s3 先被放到池中
  所以 "你好"+"我好" 被创建的时候,程序找到了具有相同值的 s3 ,将"你好"+"我好"引用 s3的对象
  所以在比较 s3=="你好"+"我好",由于两者引用的同一个对象,所以为true
而上面楼主三的代码与提问的楼主的代码就不一样了!结果肯定不一样了! 仔细看看!
回复 使用道具 举报
你好,字符串常量在编译时期已被确定,会被存放到字符串常量池中,"你好"这个字符串已经在字符串常量池中存在,所以"你好"+"你好"的时候不会创建新的对象,而他们相加后的字符串也存在于字符串常量池中所以第二个打印结果是true
回复 使用道具 举报
cehkongfu 发表于 2012-12-13 21:30
同学 你是不是搞错了

同学你的代码跟 那位同学的不一样 ,看到你的代码差点颠覆了我对String类的认知,我仔细一看我没问题
s1:你好
s3 :我好 不相等没什么质疑吧
s1 :你好    temp=“你好”+“我好” s1!=temp吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马