黑马程序员技术交流社区
标题:
string在开辟空间和存储时指向怎么那么乱
[打印本页]
作者:
罗雪梅
时间:
2012-9-20 15:54
标题:
string在开辟空间和存储时指向怎么那么乱
本帖最后由 罗雪梅 于 2012-9-21 13:57 编辑
String s1 = new String("amit");
System.out.println(s1.replace('m','r'));
System.out.println(s1);
String s3 = "arit";
String s4 = "arit";
String s2 = s1.replace('m','r');
System.out.println(s2 == s3);
System.out.println(s3 == s4);
1.他new一个对象时,直接传一个常量字符串,这个是存放在字符串池中的,他的引用是在堆中开辟了一块空间放他的地址吗?
2.replace方法中用r换掉了m,但这个操作并没有保存为什么,到下面的时候又还是用的amit去做的判断呢
作者:
赵永康
时间:
2012-9-20 16:37
String s3 = new String("arit");
String s4 = "arit";
System.out.println(s3 == s4);
首先说一下 这个结构是false,因为s3相当于创建了两次对象,我记得毕老师的视频说过这方面的事!你第一次知识把s1修改了,并没有再赋值给s1
所以结构还是s1的原值。参见上面的原理,你可以多测试几次,相信你一定会找到答案的
作者:
黑马张旭明
时间:
2012-9-20 16:45
1.他new一个对象时,直接传一个常量字符串,这个是存放在字符串池中的,他的引用是在堆中开辟了一块空间放他的地址吗?
首先,楼主要区分开String s = "abc";和String s = new String("abc");的区别。
String s = "abc";是先在字符串池中找是否有"abc",没有就创建其对象并返回"abc"的引用给s。
String s = new String("abc"); 也是先在字符串池中找是否有"abc",没有就创建其对象,因为有new的存在还会在堆内存中创建String对象存储"abc",并将对象的引用(不是字符串池中的)返回给s。
2.replace方法中用r换掉了m,但这个操作并没有保存为什么,到下面的时候又还是用的amit去做的判断呢
String s1 = new String("amit");
System.out.println(s1.replace('m','r'));
System.out.println(s1);
String s3 = "arit";
String s4 = "arit";
String s2 = s1.replace('m','r');
//这后面加System.out.println(s2);是"arit"。
System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s1.replace('m','r')); 是返回一个替换后的字符串,调用他并不改变原来的字符串,在这s1并没有改变。
String s2 = s1.replace('m','r'); 楼主是根据上面的System.out.println(s1); 认为这里s2是"amit",其实这里s2的内容已经是
"arit"了。至于 System.out.println(s2 == s3); 为什么是false就可以用前面说到的字符串常量池解释了,s3指向的是字符串常量池中的"arit",而s2是s1经过替换后得到的字符串,s2这里也是指向堆内存。
作者:
罗雪梅
时间:
2012-9-21 13:56
谢谢,其实写完这个问题的时候就明白了一点点了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2