黑马程序员技术交流社区

标题: String问题 [打印本页]

作者: 卞潇洋    时间: 2012-12-13 20:56
标题: String问题
本帖最后由 天堂木乃伊 于 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?


作者: 黑马黄涛    时间: 2012-12-13 21:22
查看帮助文档你会看见
public final class String  字符串是常量;它们的值在创建之后不能更改,因为 String 对象是不可变的,所以可以共享
所以s1和s2指向同一块内存空间,也就是指向同一个对象...
这样可以节省内存...java设计者考虑的....
作者: cehkongfu    时间: 2012-12-13 21:30
  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. }
复制代码

同学 你是不是搞错了


作者: 卞潇洋    时间: 2012-12-13 21:42
cehkongfu 发表于 2012-12-13 21:30
同学 你是不是搞错了

写错了,问题已经改过来了
作者: ying    时间: 2013-1-1 08:57
本帖最后由 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
而上面楼主三的代码与提问的楼主的代码就不一样了!结果肯定不一样了! 仔细看看!

作者: 何竹冬    时间: 2013-1-4 00:27
你好,字符串常量在编译时期已被确定,会被存放到字符串常量池中,"你好"这个字符串已经在字符串常量池中存在,所以"你好"+"你好"的时候不会创建新的对象,而他们相加后的字符串也存在于字符串常量池中所以第二个打印结果是true

作者: 杨杨    时间: 2013-2-4 09:41
cehkongfu 发表于 2012-12-13 21:30
同学 你是不是搞错了

同学你的代码跟 那位同学的不一样 ,看到你的代码差点颠覆了我对String类的认知,我仔细一看我没问题
s1:你好
s3 :我好 不相等没什么质疑吧
s1 :你好    temp=“你好”+“我好” s1!=temp吧




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