黑马程序员技术交流社区

标题: 我的分析对吗?请高手指点一下吧 [打印本页]

作者: 任黎明    时间: 2014-6-4 11:29
标题: 我的分析对吗?请高手指点一下吧
5、 写出以下代码执行结果,分析为什么?(没有分析结果不得分)

        public class Test {
                public static void main(String[] args) {
                        String s = "abc";
                        s.substring(1);
                        s.replace("bc", "xyz");
                       System.out.println(s);
                       String value = new String ("abc");
                       System.out.println(s == value);
                }
       }
答案:
        运行结果为:
        abc
        false
        分析:
                字符串一旦初始化就不会再改变,s.substring()和s.replace("bc","xyz")均返回一个新的字符串,
        并未改变s的内容,所以输出的仍然是abc.
                ==比较的是字符串s和value的地址值,他们是两个不同的对象,在内存中的地址值是不同的,所以打
        印结果是false.
       



作者: Wokno    时间: 2014-6-4 16:31
以下是我的理解:

以上是我分析的内存示意图。
String s = "abc";  //在data segment内分配空间并将字符串“abc”存入其中,并将其地址存入栈中的s中。
s.substring(1);  //从位置1处截取s字符串并返回,注意没有存入s字符串中。
s.replace("bc", "xyz"); //返回一个新的字符串,并用字符串“xyz”代替原字符串的“bc”,注意也没有存入s字符串中。
System.out.println(s); //打印字符串s的内容。
String value = new String("abc"); //在heap中new一个对象,并将在data segment中为新的字符串“abc”分配的空间的地址存入堆中的字符串对象中。,并将对象的地址赋给stack中的value变量。
System.out.println(s == value); //打印s是否等于value。

希望能帮助到你。。。。






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