黑马程序员技术交流社区

标题: java的string类的不变性不是很懂...求解! [打印本页]

作者: a397131103    时间: 2015-5-21 22:03
标题: java的string类的不变性不是很懂...求解!
本帖最后由 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

作者: CLAY    时间: 2015-5-21 23:09
      局部变量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  
作者: 张凝宁    时间: 2015-5-21 23:17
怎么搞不清楚呢???  字符串相加还是字符串类型的,s3呢 就是俩个字符串相加所以还是字符串。 并且字符串相加是第一个字符串就是s1完事后后面跟着添加s2所以就生成了helloword....        你说的==这个问题呢  他是这个意思  == 是比较俩个对象是否相同的    第一个false 呢  他是s4对象  在堆内存中 他有一个固定的值比如是333   然后后面的  s1+s2  他虽然也是 helloword  但是他是一个新的对象  那么他的值就不是333  是别的 所以不相等 。  第二个直接相加 那他就是一个对象的     后面的。equalse  呢是比较字符串的值 也就是  helloworld的 所以为true
作者: shawdo    时间: 2015-5-21 23:18
System.out.println(s4 == (s1+s2)); 这个比较的是地址值,必须是false
作者: a397131103    时间: 2015-5-22 21:24
还是不懂啊
作者: 白水丶    时间: 2015-5-22 21:40
常量和变量的区别




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