A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 斥候7300 中级黑马   /  2015-11-27 17:21  /  682 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

考试的题目如下
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);
        }
}

2 个回复

倒序浏览
回答如下

/*输出结果abc false
* 函数运行时main函数进栈
* 1、定义了一个String类型的变量s,在方法区中的常量池中生成了一个字符串"abc",在将这个字符串的引用(假设为0x01)赋值给变量s
* 2、字符串s调用substring方法截取了一个新的字符串 "bc" ,这时在方法区中的常量池中生成了一个字符串"bc",这个字符串的有一个引用(假设为0x02)
* 3、字符串s调用replace生成了一个新的字符串 "axyz",这时在方法区中的常量池中生成了一个字符串"axyz",这个字符串的有一个引用(假设为0x03)
* 上面的2、3两步都在方法区中的常量池中生成了一个新的字符串,但是没有将新生成的字符串的引用地址赋值给变量s
* 所以此时变量s 的引用地址还是指向最开始的字符串"abc"的引用地址(0x01)
* 4、所以输出的s的值为 字符串 "abc"
* 5、定义了一个String类型的变量value,并在堆内存中开辟了一个空间(假设为0x22),并将这个空间的引用地址(0x22)赋值给 变量value,(空间里有一个引用地址(0x01)指向字符串"abc")
* 6、s==value是在比较两个变量的引用地址,而此时s指向的方法区常量池中的地址为0x01   value指向的是堆内存中的0x22  所以输出结果为false
*/
回复 使用道具 举报
不知道上面那样回答正不正确,感觉还是画图回答好些
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马