黑马程序员技术交流社区
标题:
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