黑马程序员技术交流社区

标题: 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