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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 为爱编程 中级黑马   /  2014-7-12 17:03  /  1366 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

题目内容:


/*
* 写出以下代码执行结果,分析为什么?(没有分析结果不得分)
*       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
*  
*/  

评分

参与人数 1技术分 +1 收起 理由
淡夜清风 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
很详细,学习了!
回复 使用道具 举报
String是不可变对象,栈中怎么可能存有对象?又怎么可能把栈中的字符串从abc改为bc?实际上,substring是在堆中开辟空间,创建一个新的字符串对象,然后把该对象的地址返回。但由于main函数中没有引用变量指向该对象,所以substring返回后,这个新建的字符串对象就被垃圾回收了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马