黑马程序员技术交流社区

标题: 写出以下代码执行结果,分析为什么? [打印本页]

作者: 艾提儿    时间: 2014-8-18 23:02
标题: 写出以下代码执行结果,分析为什么?
  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-18 23:11
本帖最后由 迷失的独白 于 2014-8-18 23:14 编辑

abc
false
我表达力不好
创建一个字符串,s指向了abc
调用s的sbstring(),返回abc1,有返回值,但是没有变量接受,abc1在内存中会被释放掉
同理调用s的replace,返回axyz1,有返回值,但是没有变量接受,axyz1在内存中会被释放掉
打印为abc
在内存中创建两个对象
s!=value
其实System.out.println(s.equals(value));是true
判断字符串是否相等

作者: LoveJava8    时间: 2014-8-18 23:19
结果是abc和false因为s=abc是在常量池中而String value = new String ()是在内存中开辟了空间地址就不相同
所以而==比的是地址所以为false,replace 替换了值没有变量接收结果相当于值未改变
作者: Baiye    时间: 2014-8-18 23:25
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         String s = "abc";  //s指向常量池中的"abc"常量
  4.         s.substring(1);  // s 任然为"abc"
  5.         s.replace("bc", "xyz");  //s 任然为"abc"
  6.         System.out.println(s);   //输出"abc"
  7.         String value = new String ("abc");  //value指向堆内存中的String对象
  8.         System.out.println(s == value);  //一个在对象常量池中,一个在堆内存中,所以返回false
  9.         }
  10.        }
复制代码



作者: relive    时间: 2014-8-18 23:32
abc; false;
作者: iefegend    时间: 2014-8-19 09:51
字符串是常量,一般是存放在字符串常量池中,且一旦创建就无法改变,我们使用字符串的常用方法去操作字符串时,大多数情况下都是产生了一个新的字符串,而本身原有的字符串的内容是不变的,它与StringBuffer不同,而且,字符串的两种创建方式(字面值和new的方式)是有区别。
作者: 这个夏天的芬芳    时间: 2014-8-19 11:34
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: dajiaoya    时间: 2015-7-17 11:22
赞一个,分享快乐
作者: 王竹根    时间: 2015-7-18 11:09
不错。。。
作者: 熊肃言    时间: 2015-7-25 19:26
Baiye 发表于 2014-8-18 23:25

分析的一点都不准确,乱分析,误人子弟
作者: wx_ao22R6RC    时间: 2015-11-5 14:45
public class Test6 {
          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);
                 /*
                  * s.substring(1);的作用是从第一个位置输出输出的结果也就是"bc"但是字符串s不变
                  * s.replace("bc", "xyz");的作用是用xyz替换s中所有的bc,同样s也不便。
                  * 由于==是比较两个数的地址值虽然s和value都是abc但是地址值不同所以不等,返回false
                  * 因为String s = "abc"定义的abc是存在常量池里面的有一个地址值,而在String value = new String ("abc");
                  * 中常量池中的abc地址值给了value,但是指向栈的地址值在堆空间创建了一个实体的地址值与常量池赋给value的地址值不同,
                  * 所以返回的是false




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