本帖最后由 依然超级赛亚人 于 2014-8-14 11:03 编辑
常量池的概念你应该知道,我就直接忽略这一块,然后在你的代码上通过注释的方式说你的问题:- //首先,这道题中==是用来比较地址值的。
- public class Test {
- public static void main(String[] args) {
- String a="abcd";//执行这步时,字符a,b,c,d先进常量池,然后在堆中开辟一个空间,把字符串"abcd"存进去,地址值复制给变量a。
- String b="ab";//执行这一步时,系统在常量池中找到字符a,b然后也开辟一个空间把地址值复制给变量b.
- String c="cd";//执行这一步和上一步相同。
- String d="ab"+"cd";//执行这一步时先在右边进行字符串的连接,得到"abcd",然后它发现内存中已经有这个字符串(a指向的),所以不再开辟新空间,直接把a指向的地址赋给d一份,那么a和d都指向同一地址,你的第一个输出语句结果就为true了。
- String d2=b+c;//执行这一步时,因为是变量直接相加,所以跟上面不一样,系统又给b+c开辟新的空间,然后存进字符串"abcd",把新地址复制给d2,这样下来d2的地址值就和a以及b不一样了,第二个输出结果就为false。
- A: System.out.println(a==d);//输出true
- B: System.out.println(a==d2);//输出false
- }
- }
复制代码
我的理解上是面这样的,不知其他人有什么看法,楼主多参照比较一下。如有错误希望批评指正,一块学习。 |