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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 a397131103 于 2015-5-24 21:55 编辑

         String s1 = "hello";
         String s2 = "world";
         String s3 = s1 + s2;
        String s4 = "helloworld";
        System.out.println(s3);      //helloworld
        System.out.println(s4);       //helloworld
     
       System.out.println(s4 == (s1+s2));      //false      
       System.out.println(s4 == ("hello"+"world"));       //true
        上面两个结果怎么区别,总是搞不清楚,请大家帮忙解释下.

        System.out.println(s4.equals(s1+s2));          //true

5 个回复

正序浏览
常量和变量的区别
回复 使用道具 举报
还是不懂啊
回复 使用道具 举报
System.out.println(s4 == (s1+s2)); 这个比较的是地址值,必须是false
回复 使用道具 举报
怎么搞不清楚呢???  字符串相加还是字符串类型的,s3呢 就是俩个字符串相加所以还是字符串。 并且字符串相加是第一个字符串就是s1完事后后面跟着添加s2所以就生成了helloword....        你说的==这个问题呢  他是这个意思  == 是比较俩个对象是否相同的    第一个false 呢  他是s4对象  在堆内存中 他有一个固定的值比如是333   然后后面的  s1+s2  他虽然也是 helloword  但是他是一个新的对象  那么他的值就不是333  是别的 所以不相等 。  第二个直接相加 那他就是一个对象的     后面的。equalse  呢是比较字符串的值 也就是  helloworld的 所以为true
回复 使用道具 举报 1 0
      局部变量s1s2存储的是存储两个拘留字符串对象(intern字符串对象)的地址。
         *  
         * 第三行代码原理(s1+s2):
         * 运行期JVM首先会在堆中创建一个StringBuilder类,
         * 同时用s1指向的拘留字符串对象完成初始化,
         * 然后调用append方法完成对s2所指向的拘留字符串的合并,
         * 接着调用StringBuilder的toString()方法在堆中创建一个String对象,
         * 最后将刚生成的String对象的堆地址存放在局部变量s3中。
         *  
         * 而s4存储的是字符串池中"helloworld"所对应的拘留字符串对象的地址。
         * s3与s4地址当然不一样了。
         *  
         * 内存中实际上有五个字符串对象:
         *       三个拘留字符串对象、一个String对象和一个StringBuilder对象。
         */  
        String s1 = "hello";  //1个对象  
        String s2 = "world";  //1个对象                                         
        String s3 = str2+str3;                                       
        String s4 = "helloworld";   
        System.out.println("s3 = s4 : " + (str4==str5)); // false  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马