黑马程序员技术交流社区

标题: 一道题目来解释 == 与 equals 的区别: [打印本页]

作者: 为爱编程    时间: 2014-7-12 17:03
标题: 一道题目来解释 == 与 equals 的区别:
题目内容:


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

作者: Silvester    时间: 2014-7-12 17:27
很详细,学习了!
作者: fantacyleo    时间: 2014-7-12 17:44
String是不可变对象,栈中怎么可能存有对象?又怎么可能把栈中的字符串从abc改为bc?实际上,substring是在堆中开辟空间,创建一个新的字符串对象,然后把该对象的地址返回。但由于main函数中没有引用变量指向该对象,所以substring返回后,这个新建的字符串对象就被垃圾回收了




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