黑马程序员技术交流社区
标题:
关于引用地址问题的解答
[打印本页]
作者:
斥候7300
时间:
2015-11-27 17:21
标题:
关于引用地址问题的解答
考试的题目如下
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);
}
}
作者:
斥候7300
时间:
2015-11-27 17:24
回答如下
/*输出结果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
*/
作者:
斥候7300
时间:
2015-11-27 17:25
不知道上面那样回答正不正确,感觉还是画图回答好些
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2