题目内容:
/*
* 写出以下代码执行结果,分析为什么?(没有分析结果不得分)
* 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
*
* 解释:
* String s = "abc";
* 1,在栈内存中开辟空间存放字符串s的地址值
* 2,abc 存放在常量池
* 3,引用s只想常量池中的 abc
* abc:
* 1, s.substring(1); 引用String类里的功能,表示从 1 索引出开始直到字符串 s 的结尾
* 1>.在栈中开辟一片空间,存放常量池中 abc
* 2>.引用功能改变栈中的字符串为 abc 为bc
* 3>.功能调用完毕,弹栈
* 4>.常量池中的字符串并没有改变
*
* 2, s.replace("bc", "xyz"); 引用String类里的功能,表示用新的字符串"xyz"代替老的字符串"bc"
* 1>.在栈中开辟一篇空间,存放常量池中 abc
* 2>.引用功能改变栈中的字符串为 abc 为 axyz
* 3>.功能调用完毕,弹栈
* 4>.常量池中的字符串并没有改变
*
* 3, 所以输出结果还是字符串s
*
* false:
* String value = new String ("abc");
* 1>.栈中开辟一片空间存放 value 的地址值
* 2>.在堆中开辟一片空间存放一个新建的String对象"abc"
* 3>.value指向堆中的新建的String对象"abc"
* s == value
* 1>. == 比较的是地址值,
* 2>.value所指的对象地址为堆中地址,而常量 s 所指向地址在常量池中,因此输出为false
*
*/
|