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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 画了一个圈儿 于 2014-8-17 12:27 编辑

  1. String s1 = "Hello"+"World";
  2. String s2 = "Hello";
  3. String s3 = "World";
  4. String s4 = s2+s3;
  5. System.out.println(s1==s4);
复制代码


输出结果显示是false。也就是说,此程序共创建了四个对象。
想请问,为什么s1与s4的对象内容是相同的,String s4为什么还是新建了一个对象,而不是经过判断内容与s1相同,直接指向s1所指的地址呢。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

10 个回复

倒序浏览
这个是不是得问问开发出Java的人了,我也来学习一下。。
回复 使用道具 举报
方法区中有一个常量池,常量池中存放字符串常量String
1.String s1="HelloWorld";//此处和"Hello"+"World"是相同的,会拼起来当成一个串放入常量池
当用以上方式创建实例对象时,会首先去常量池中查找,如果有指向引用,没有则开辟空间存储常量,并指向引用
2.String s5=new String("HelloWorld");
当用new创建实例对象时,会在堆内存中开辟空间存放"HelloWorld",然后再去常量池中查看是否有"HelloWorld",
如果有则与堆内存的"HelloWorld"建立关系,没有则创建之后再建立关系,此时输出s1==s5也是false,因为指向不同
3.而String s2="Hello",String s3="World"都会在常量池中开辟空间存放字符串
4.当需要拼串时,也就是s4=s2+s3,会在堆内存中开辟空间存放新的字符串,指向s4
双等号比较的是两个引用的内存地址值:所以s1和s4不相等

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 画了一个圈儿 于 2014-8-14 14:24 编辑
李彦来 发表于 2014-8-14 12:44
方法区中有一个常量池,常量池中存放字符串常量String
1.String s1="HelloWorld";//此处和"Hello"+"World"是 ...

谢谢啦  也就是说s = s2+s3; 首先在内存中new了一个对象,这个对象再指向常量池中的“HelloWorld”?
回复 使用道具 举报
李彦来 发表于 2014-8-14 12:44
方法区中有一个常量池,常量池中存放字符串常量String
1.String s1="HelloWorld";//此处和"Hello"+"World"是 ...

ls的讲得透彻,同样学习了
回复 使用道具 举报
学习了。。。。膜拜
回复 使用道具 举报
画了一个圈儿 发表于 2014-8-14 14:06
谢谢啦  也就是说s = s2+s3; 首先在内存中new了一个对象,这个对象再指向常量池中的“HelloWorld”? ...

感觉new 和 == 是不一样的。。。迷惑。。。
回复 使用道具 举报
画了一个圈儿 发表于 2014-8-14 14:06
谢谢啦  也就是说s = s2+s3; 首先在内存中new了一个对象,这个对象再指向常量池中的“HelloWorld”? ...

嗯,是的
回复 使用道具 举报
总结回答的好棒,收藏了
回复 使用道具 举报
李彦来 发表于 2014-8-14 12:44
方法区中有一个常量池,常量池中存放字符串常量String
1.String s1="HelloWorld";//此处和"Hello"+"World"是 ...

太专业太详细!
回复 使用道具 举报
java字符串的“+”有重载,底层是利用StringBuilder的append方法来实现的,所以在字符串相加之前会先new一个StringBuilder出来,再append,所以导致引用的地址不一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马