黑马程序员技术交流社区

标题: 想不出来为什么结果是这样的~大神们请指点指点啊 [打印本页]

作者: 回头浪子心    时间: 2014-8-19 22:20
标题: 想不出来为什么结果是这样的~大神们请指点指点啊
写出以下代码执行结果,分析为什么?

  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);
    }
  }


作者: 柀堓椛開    时间: 2014-8-19 22:51
s=s.replace("bc", "xyz");    赋值给s   就可以输出  axyz      String是引用类型
作者: 回头浪子心    时间: 2014-8-19 22:54
柀堓椛開 发表于 2014-8-19 22:51
s=s.replace("bc", "xyz");    赋值给s   就可以输出  axyz      String是引用类型

执行结果却是“abc”跟“false”。。。。。
作者: 姜佳文    时间: 2014-8-19 22:57
你用的substring和replace都是返回一个字符串,不改变原来字符串的内容的,而且new的value地址值和s不一样,结果是abc和false
作者: 回头浪子心    时间: 2014-8-19 23:02
姜佳文 发表于 2014-8-19 22:57
你用的substring和replace都是返回一个字符串,不改变原来字符串的内容的,而且new的value地址值和s不一样 ...

哦哦哦。。。。谢谢指教!
作者: ckkele    时间: 2014-8-19 23:24
String s = "abc";这个中 S是引用  而 "abc";是在常量池里这里有一个地址,而String value = new String ("abc");这里NEW的对象"abc"是在堆内存中 这里有一个地址 所以他们两个不是同一个地址 所以最后输出System.out.println(s); 这里的S还是原来的abc,而 System.out.println(s == value);这里的 value 指向的是堆内存中的那个地址
作者: java—family    时间: 2014-8-19 23:51
姜佳文 发表于 2014-8-19 22:57
你用的substring和replace都是返回一个字符串,不改变原来字符串的内容的,而且new的value地址值和s不一样 ...

同意你的观点
作者: 215041631    时间: 2014-8-20 00:08
String一旦被初始化就无法更改,SUBSTRING和REPLACE都是返回一个新的字符串。而value指向一个堆内存中STRING对象ABC,S则指向常量池中的ABC
作者: jeromechen    时间: 2014-8-20 00:13
姜佳文 发表于 2014-8-19 22:57
你用的substring和replace都是返回一个字符串,不改变原来字符串的内容的,而且new的value地址值和s不一样 ...

有道理,老毕视频上有这样讲过
作者: 舍我其谁    时间: 2014-8-20 00:36
String类的方法返回值是String的都是返回一个新的字符串,不改变原串的值
作者: 戏言丶    时间: 2014-8-20 00:54
姜佳文 发表于 2014-8-19 22:57
你用的substring和replace都是返回一个字符串,不改变原来字符串的内容的,而且new的value地址值和s不一样 ...

我也同意你的看法
作者: Huberry    时间: 2014-8-20 04:29
字符串一旦被初始化,就不能被改变,除非你对s重新赋值,它的值才会变
substring()和replace()都是返回一个字符串,但并没有赋值给调用它的对象,所以s的值不会变

value是一个新创建的对象,地址跟s不同




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